#javascript #callback
Есть такой пример в javascript: var fruits = ['apple', 'banana', 'orange', 'grapes', 'pear', 'passionfruit']; // The three values on the callback function are: // element - The element being traversed // index - The current index of the item in the array starting at 0 // array - The array being traversed (probably mostly irrelevant) fruits.forEach(function(element, index, array) { console.log(index, element); }); в метод forEach передается функция. Я так понимаю, что в методе forEach где-то эта передаваемая функция вызывается. Чтобы ее вызвать, нужно ей передать 3 аргумента (желательно). Люди, написавшие код этой функции как-то там перебирают элементы массива fruits и вызывают мою callback функцию, передавая ей все эти три параметра. Каким образом они знают что на каком месте стоит? Ведь по сути я могу написать не function(element, index,array) а function(myelement, myindex,myarray) т.е. название параметров сменить и все равно будет работать. Получается, что элементы, передаваемые в функцию "привязаны" к месту параметра - 1, 2, 3 по счету. Так? Или где-то я ошибаюсь. Подскажите, пожалуйста? Вынесу вопрос отдельно: параметры, передаваемые в колбэк функцию "привязаны" к месту параметра?
Ответы
Ответ 1
Аргументы, переданные в функцию - это, по сути, массив arguments[]. Ваше предположение, что порядок имеет значение, верно. Магия JavaScript: arguments (Хабр).Ответ 2
Люди, написавшие код этой функции как-то там перебирают элементы массива fruits и вызывают мою callback функцию, передавая ей все эти три параметра. Каким образом они знают что на каком месте стоит? Все очень просто - они не знают как описана функция, которая передается в качестве коллбэка. Они просто берут ее и вызывают передавая ей параметры: element, index, sourse_array. Кроме этого, у коллбэка может быть указан контекст (значение this) внутри функции. Так как разработчики forEach не знают, какую функцию им передадут, они просто вызывают любой коллбэк в следующем виде callback(element,index,sourse_array) Либо дополнительно устанавливая this, что эквивалентно вызову call callback.call(thisArg,element,index,sourse_array) При этом сама функция коллбэка может быть объявлена с тремя параметрами, с двумя, с четырьмя, вообще без параметров и т.д. Подробнее описание forEach в справкеОтвет 3
Вы аргументы можете назвать как угодно, например fruits.forEach(function(first, second, third) { // first всегда будет итерируемым елементом масива // second всегда будет его номером // third всегда будет масивом по которому осуществляется итерация // например даст true console.log(third[second] === first) }); Кроме того, все аргументы являются необязательными (хотя forEach без первого елемента теряет смысл) Более подробно можно почитать тут. Там же в конце есть пример реализации функции forEach()
Комментариев нет:
Отправить комментарий