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

时间:2013-12-24 00:59:45

标签: javascript module iterator global-variables 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);

我应该代替?

2 个答案:

答案 0 :(得分:2)

选择是创建自己的命名空间对象还是使用现有的命名空间对象。

在普通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 :(得分:1)

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

如果我已正确理解您的问题,您的担忧基本上就是处理命名空间。

  1. 如果被覆盖则会丢失它们。这很容易在一个小项目中管理,但如果你有很多程序员在工作,每个人都喜欢使用zzz作为一个全局对象,某人的功能将被覆盖。

    你的代码

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

    你朋友的代码

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

    如果您尝试调用您的函数zzz.makeWorldPeace(),您将获得TypeError Object has no method makeWorldPeace

  2. 让他们被类似的代码覆盖。与以前相同的例子,但这次你朋友的代码就是这个

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

    这可能不是您原来的意图。

  3. JavaScript中的命名空间有很多模式。大多数人都试图做以下事情以避免冲突。

    1. 为您的根对象选择一个好名字。 _utilsJSHelpers,无论您的项目中有什么独特之处。
    2. 始终使用var
    3. 来管理您的变量范围
    4. 如果你想要保持良好和谨慎,请确保没有任何内存泄漏,或者你正在使用大块代码和其他大块代码,将事情包装在像自执行的函数中此

      (function(export){
         var intermediateFunction = function(){};
         var zzz = { /* all the things */ };
         export.zzz = zzz;
      })(window)
      
      console.log(intermediateFunction); // outputs: undefined
      
    5. 希望有所帮助。