0

这可能是 javascript 101 或 Backbone 100 问题。但是我很乐意提出这个开始的问题而不是在这里被取笑:)

以下代码片段来自 Code School 的 Anatomy of Backbone JS 课程:

render: function(){ 
    this.collection.forEach(this.addOne, this);
} 

addOne: function(todoItem){
    var todoView = new TodoView({model: todoItem}); 
    this.$el.append(todoView.render().el);

}

正在从渲染函数调用 addOne 函数。addOne 函数定义显示一个参数“todoItem”正在传递给它。但是,如果您查看从渲染中对 addOne 的调用,它不会显示传递给它的参数/参数。代码怎么可能正常工作?

在此先感谢您的时间。

巴拉特

4

4 回答 4

0

this.render不直接调用this.addOne;相反,它调用this.collection.forEach,传入this.addOne- 函数本身 - 作为参数。它this.collection.forEach调用了你传递给它的函数。

对于一个更简单的示例,此代码片段:

function call_function(f, arg)
{
    f(arg);      // call the function you passed in
}

call_function(alert, s);

会这样做:

alert(s);
于 2012-09-21T02:59:04.217 回答
0

forEach函数的第一个参数是一个回调函数,该forEach函数调用该函数,将数组的每个元素作为参数传递。

更直观地,您的调用forEach将导致:

this.collection.forEach(this.addOne, this) -> 
           |this.addOne(this.collection[0], 0, this.collection)
           |this.addOne(this.collection[1], 1, this.collection)
           |this.addOne(this.collection[2], 2, this.collection)
           |this.addOne(this.collection[3], 3, this.collection)
           |this.addOne(this.collection[4], 4, this.collection)
           |...
           |this.addOne(this.collection[n], n, this.collection)

.. wheren表示数组的最后一个索引this.collection

该函数addOne将忽略第二个和第三个参数,因为addOne只指定了一个参数。此外,thisfromaddOne将设置为this变量 from render

更多详细信息可从Mozilla Developer NetworkMSDN获得。

于 2012-09-21T02:59:56.183 回答
0

看看文档。其实这一切都很简单。forEach为集合中的每个元素调用addOne一次并将参数传递给它(element, index, array)。在这种情况下,addOne只需忽略除第一个参数之外的所有参数。

于 2012-09-21T03:00:33.700 回答
0

forEach 是在 JavaScript 1.6 中实现的,如果您查看文档,它是这样的:

array.forEach(callback[, thisArg])

渲染的 forEach 部分中的第二个参数实际上是传递给 addOne 函数的参数,即“todoItem”。'this' 指的是数组集合,addOne 回调将针对此集合中的每个项目执行。

于 2012-09-21T03:01:38.070 回答