2011-10-13 27 views
1

我一直在backbone.js中工作,遇到下面的代码片段。javascript中的差异_()和()

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

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

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

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

+1

_是一个有效的标识符。在这种情况下,_是函数的名称。你可以命名一个变量_,但在你的例子中,一个库创建了一个名为_的函数。 –

回答

11

我想这是它提供了each方法Underscore.js library

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

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

顺便说一句,这也是Backbone's documentation描述:

骨干唯一的硬依赖是Underscore.js


而且FWIW,如@Jonathon已经表示,一般来说,_是一个有效的变量名,在这种情况下,它包含一个函数。添加括号后面的函数引用调用该功能,因此,_()调用由_提到的功能。这没什么特别的。

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

3

主干取决于Underscore,它实现了许多实用功能。您可以使用_()函数包装数组,并使用Underscore API演示here

下划线而不触及原型实现这些功能,所以each不可用于规则阵列。但是,它可以从包装原始数组的_函数返回的对象中调用。

3

骨干是建立在underscore顶部,一个实用程序库提供了很多有用的功能,是不是本机的JS,但可能应该是(例如喜欢的东西遍历对象,阵列的映射,从而消除在阵列中重复的项目,诸如此类的东西)。

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

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