【问题标题】:Where should I store my underscore.js iterators?我应该在哪里存储 underscore.js 迭代器?
【发布时间】:2013-12-24 00:59:45
【问题描述】:

假设我想要一些“全局变量”(用? 描述),我可以在其中存储然后访问以下函数:

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

例如与map 或filter 一起使用:

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

我应该用什么代替??

【问题讨论】:

  • 注意:我使用的是 Angular.js,但我也对一般的纯 JS 甚至 jQuery 想法感兴趣。

标签: javascript module iterator global-variables underscore.js


【解决方案1】:

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

在纯 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; };

【讨论】:

  • 您通常使用_.mixin 将内容添加到下划线,以确保所有_.f(x)、_(x).f() 和链接都能正常工作。在这里可能无关紧要,但好习惯就是好习惯。
  • @muistooshort - 添加了_.mixin() 选项。
  • 用这些方法“污染”_ 命名空间真的是个好主意吗?你觉得使用_.mixin({ myNamespace: { parseInt: ..., selected: ... } }); 怎么样? (如果它有效?!)
  • 任何时候你使用其他人的命名空间,你有一个很小的机会尝试用相同的名字做同样的事情,但通常比使用顶级全局命名空间更小.这里没有完美的解决方案,所以你只是选择了一个冲突几率较低的选项。我个人不会将其命名空间加倍(将其降低两层),因为这开始干扰代码的编写和阅读,超出了我认为的价值,但这只是个人意见。
【解决方案2】:

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

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

  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
    

希望对您有所帮助。

【讨论】:

  • 确保你在那个 IIFE 中使用var,否则它不会有你描述的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2017-05-11
  • 1970-01-01
  • 2019-04-25
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多