2015-10-27 4 views
1

Я погружаюсь в обратные вызовы Javascript и прочее. Я пришел вокруг функции forEach(). Функциональное имя говорит все, перебирает каждый объект в списке.Javascript для каждого обратного вызова

Когда я смотрю в 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); 
}); 

И это дает мне очевидный выход ут:

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

Я могу жить с поведением обо всем, и результат он дает, но я хочу знать, почему это работает, и я запутался об этом

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

Когда и где или как каждыйName и индекс заполняются с правильным значением? Или как я могу увидеть, как реализован forEach, потому что я предполагаю, что этот человек делает магию здесь? Или я не вижу здесь важной концепции?

+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.

Смежные вопросы