Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Передача функции в функцию в javascript

#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()

Комментариев нет:

Отправить комментарий