javascript中的差异_()和()

时间:2011-10-13 19:28:09

标签: javascript backbone.js underscore.js

我一直在使用backbone.js,并且遇到了以下代码片段。

    _(view.buttonViews).each(function(button) {
        button.render();
      });

其中view.buttonViews是一个数组。如果我带走_()并拥有

    view.buttonViews.each(function(button) {
        button.render();
      });

然后我得到一个错误,每个都不是一个函数。 _()添加了什么?谢谢!

4 个答案:

答案 0 :(得分:11)

我猜是Underscore.js library提供了each方法:

  

_.each(list, iterator, [context]) 别名:forEach
  迭代元素列表,依次产生迭代器函数。迭代器绑定到上下文对象(如果传递了一个)。每个迭代器调用都使用三个参数调用:(element,index,list)。如果list是JavaScript对象,则迭代器的参数将是(value,key,list)。如果存在,则委托原生forEach函数。

这样,_([...]).each(...)只是另一种调用它的方式。

BTW,它也在Backbone's documentation中描述:

  

Backbone唯一的硬依赖是Underscore.js


正如@Jonathon已经说过的那样,FWIW _是一个有效的变量名,在这种情况下它包含一个函数。在函数后面添加括号引用调用该函数,因此_()调用_引用的函数。没什么特别的。

除此之外,括号可以作为函数声明或表达式(function foo() {...})或grouping operatorvar i = (20 + 1) * 2;)的一部分出现。

答案 1 :(得分:3)

Backbone依赖于实现许多实用功能的Underscore。您可以使用_()函数包装数组,并使用展示here的Underscore API。

Underscore在不触及原型的情况下实现这些功能,因此常规阵列无法使用each。但是,它可以从_函数返回的对象调用,该函数包装原始数组。

答案 2 :(得分:3)

Backbone构建在underscore之上,这是一个实用程序库,它提供了许多有用的功能,这些功能不是JS本机的,但可能应该是(例如遍历对象,数组映射,消除重复项目等)数组,那种事。)

可以使用面向对象或功能样式编写。因此,例如,您的代码片段也可以这样编写:

_.each(view.buttonViews,function(button) {
        button.render();
      });

答案 3 :(得分:2)

Backbone提供来自Underscore.js的功能 - > http://documentcloud.github.com/backbone/#Collection-Underscore-Methods