2013-12-24 69 views
0

说我希望有一些“全局”(与?描述)在那里我可以存储并访问以下功能:我应该在哪里存储我的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); 

我应该用什么来代替?

+0

注意:我使用的是Angular.js,但我也对一般的普通JS或甚至jQuery的想法感兴趣。 – TWiStErRob

回答

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

你通常使用['_.mixin'](http://underscorejs.org/#mixin)向Underscore添加内容以确保所有'_.f(x)','_(x) .f()',并链接正常工作。在这里可能无所谓,但良好的习惯是良好的习惯。 –

+0

@ muistooshort - 添加了'_.mixin()'选项。 – jfriend00

+0

用这些方法“污染”_ _命名空间真的是个好主意吗?你怎么看待'_.mixin({myNamespace:{parseInt:...,selected:...}});'? (如果它可以工作吗?!) – TWiStErRob

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() 
        } 
    }; 
    

    这可能不是你的本意。

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

  1. 为您的根对象选择一个好名字。 _utils,JSHelpers,无论在您的项目中都是独一无二的。
  2. 通过始终使用var来很好地管理您的变量范围。
  3. 如果你想要保持良好和谨慎,确保你没有任何内存泄漏,或者你正在使用大块的代码和其他大块代码,把东西包装在一个自我执行的函数中,像这样

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

希望有所帮助。

+2

确保你在IIFE里面使用'var',否则它不会有你描述的效果。 – Dennis

+0

哎呀,好眼睛。谢谢。更新。 – fet

相关问题