2015-10-27 90 views
1

我正在潛入Javascript回調和東西。我來到了forEach()函數。函數名稱說明了這一切,循環遍歷列表中的每個對象。Javascript for each callback

當我看進documentation我看到的語法如下:

arr.forEach(callback[, thisArg]) 

和文檔還提到參數

currentValue 
index 
array 

我偶然發現了一個foreach實現的一個簡單的例子:

var friends = ["Mike", "Stacy", "Andy", "Rick"]; 

friends.forEach(function (eachName, index){ 
    console.log(index + 1 + ". " + eachName); 
}); 

而這讓我明顯感覺到UT:

"1. Mike" 
"2. Stacy" 
"3. Andy" 
"4. Rick" 

我可以用一切並給出結果的行爲活着,但我想知道爲什麼這是工作,我很困惑這個

...function (eachName, index)... 

何時何地或eachName和index如何填充正確的值?或者我怎樣才能看到for each是否被實現,因爲我猜這個人在這裏做魔術?或者我在這裏錯過了一個重要的概念?

+1

ECMAScript®2015語言規範 - > ['Array.prototype.forEach()'](http://www.ecma-international.org/ecma-262/6.0/index .html#sec-array.prototype.foreach)或註釋的[ES5](https://es5.github.io#x15.4.4.18) – Andreas

回答

2

在您提供的link to MDN,你找到答案:

這三個參數(currentValue, index, array)是回調函數(arr.forEach(callback[, thisArg])的參數。要在你的例子顯示它:

var friends = ["Mike", "Stacy", "Andy", "Rick"]; 

friends.forEach(function (currentValue, index){ 
    console.log(index + 1 + ". " + currentValue); 
}); 

所以運行的forEach時,很多事情發生(have a look at the polyfill on the MDN page),但在某些時候,的forEach將通過數組中的項目循環,並呼籲您提供的回調,與上面提到的論點。簡化版本將是:

Array.prototype.forEach = function(callback, thisArg) { 
    // ... 
    for(let i = 0; let i < this.length; i++) { // "this" refers to your array here 
     // Here the arguments are passend in: 
     // currentValue = this[i] 
     // index = i 
     // array = this 
     callback.call(thisArg, this[i], i, this); 
    } 
    // ... 
}; 
1

這是一個簡化實際.forEach()實施,只是爲了給出發生什麼的基本思路。

Array.prototype.forEach = function(callback) { 
    for(var i = 0; i < this.length; ++i) { 
     callback(this[i], i, this); 
    } 
}; 

基本上它循環遍歷數組,並在每次迭代中調用具有正確參數的函數。

實際的實現是引擎特定的和(很可能)不是原生JavaScript。