我应该将underscore.js迭代器存储在哪里



假设我想要一些"全局"(用?描述),我可以在其中存储并访问以下函数:

?.parseInt = function (str) { return parseInt(str, 10); };
?.selected = function (x) { return x.selected; };

例如,在其他地方与mapfilter一起使用:

var intArray = _.map(stringArray, ?.parseInt);
var selection = _.filter(myObjsHavingSelectedAttribute, ?.selected);

我应该用什么来代替?

可以选择创建自己的命名空间对象或使用现有的命名空间对象。

在纯JS中创建自己的命名空间如下所示:

var myNamespace = myNamespace || {};
myNamespace.parseInt = function (str) { return parseInt(str, 10); };
myNamespace.selected = function (x) { return x.selected; };

使用像下划线名称空间这样的现有名称空间看起来是这样的:

_.parseInt = function (str) { return parseInt(str, 10); };
_.selected = function (x) { return x.selected; };

或者,特定于下划线,您可以使其在下划线命名空间的顶层可用,也可以在下划线包装器对象上可用,如以下所示:

_.mixin({
parseInt: function (str) { return parseInt(str, 10); },
selected: function (x) { return x.selected; }
});

使用jQuery名称空间如下所示:

$.parseInt = function (str) { return parseInt(str, 10); };
$.selected = function (x) { return x.selected; };

你真的可以把它们放在任何你喜欢的地方。

如果我正确理解了您的问题,那么您关心的问题基本上就是处理命名空间的问题。

  1. 如果它们被覆盖,则释放它们这在一个小项目中很容易管理,但如果你有很多程序员在工作,并且每个人都喜欢使用zzz作为全局对象,那么有人的函数就会被覆盖。

    您的代码

    zzz = {
    makeWorldPeace : function() { 
    // TODO: implement this 
    }    
    };
    

    你朋友的代码

    zzz = {
    makePizza : function() { 
    // ... 
    }
    };
    

    如果你试图调用函数zzz.makeWorldPeace(),你会得到一个TypeError,上面写着Object has no method makeWorldPeace

  2. 用类似的代码覆盖它们和以前的例子一样,但这次你朋友的代码是这个

    zzz = {
    makeWorldPeace: function() {
    killAllHumans()
    }
    };
    

    这可能不是你的初衷。

JavaScript中有许多命名空间模式。大多数人都会尝试做以下事情来避免冲突。

  1. 为根对象选择一个好的名称。_utilsJSHelpers,在您的项目中是独一无二的
  2. 始终使用var来管理好您的变量范围
  3. 如果你想保持良好和谨慎,确保你没有任何内存泄漏,或者你正在将大块代码与其他大块代码一起使用,请将它们封装在像这样的自动执行函数中

    (function(export){
    var intermediateFunction = function(){};
    var zzz = { /* all the things */ };
    export.zzz = zzz;
    })(window)
    console.log(intermediateFunction); // outputs: undefined
    

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新