2012-09-21 44 views
0

這可能是一個JavaScript 101或骨幹100度的問題。但是,我在問這個開始的問題感到舒適和不被取笑這裏:)的JavaScript /骨幹JS傳遞函數的參數 - 有些懷疑

下面的代碼片段是從代碼學校的骨幹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」正在傳遞給它。但是,如果您查看來自render的addOne調用,則不會顯示傳遞給它的參數/參數。代碼如何正確工作?

提前感謝您的時間。

巴拉特

回答

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) 

..其中n表示數組this.collection的最後一個索引。

功能addOne將忽略第二個和第三個參數,因爲addOne只指定了一個參數。此外,從thisaddOnerender設置爲this變量。

更多細節可從Mozilla Developer NetworkMSDN

+0

謝謝大家!我完全混淆了每個「下劃線」(別名forEach)和更新的Javascript forEach。上面的鏈接對澄清你的答案非常有幫助。 – Bharat

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); 
0

看一看的documentation。實際上這很簡單。 forEach對於集合中的每個元素調用addOne一次,並將其傳遞的參數(element, index, array)。在這種情況下,addOne只會忽略第一個參數。

0

在foreach是在JavaScript 1.6實現的,如果你看一下documentation它是這樣的:

array.forEach(callback[, thisArg]) 

中的呈現在foreach部分的第二個參數實際上是傳遞參數給addOne功能這是'todoItem'。 'this'表示數組集合,並且addOne回調將針對此集合中的每個項目執行。