我一直在使用backbone.js,并且遇到了以下代码片段。
_(view.buttonViews).each(function(button) {
button.render();
});
其中view.buttonViews是一个数组。如果我带走_()并拥有
view.buttonViews.each(function(button) {
button.render();
});
然后我得到一个错误,每个都不是一个函数。 _()添加了什么?谢谢!
答案 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 operator(var 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