#javascript #arguments
#javascript #аргументы
Вопрос:
Я столкнулся с некоторым кодом, который мне трудно полностью понять. Принципы кажутся достаточно ясными, но у меня возникают некоторые трудности со вторым аргументом, который объявлен в вызове функции forEach . Очевидно, что анонимная функция передается в forEach через аргумент action , но как именно она работает внутри цикла for?
function forEach(array, action) {
for (var i = 0; i < array.length; i )
action(array[i]);
}
var numbers = [1, 2, 3, 4, 5], sum = 0;
forEach(numbers, function(number) {
sum = number;
});
console.log(sum); // 15
Я думаю, что меня больше всего смущает то, что синтаксис анонимной функции кажется несовместимым с action(array[i])
— я имею в виду, я понимаю, что sum
получает каждое значение массива по очереди, но если функция «заменяет» action
аргумент, как и где эта (array[i])
часть вписывается?
Комментарии:
1. Я смущен вашей путаницей.
forEach
Функция принимает два параметра, второй должен быть ссылкой на функцию (любую функцию с именем, анонимную, любую)… вы передаете анонимную функцию. ВнутриforEach
функции у нее объявленaction
параметр … и поскольку он должен содержать ссылку на функцию, и вы можете вызывать функции, вы можете вызыватьaction
. Вызовaction
вызывает любой второй аргумент, который вы передали. И он вызывает ее с одним аргументом (array[i]
) , который можно использовать в качествеnumber
параметра в переданной вами функции2. @Ian — спасибо. Я знал, что мне грозит опасность не совсем правильно объяснить себя, но вы немного помогли прояснить ситуацию. Я рассматривал это так, как если бы вся функция anon содержалась в переменной action, а не в ссылке на нее. Итак, казалось, что
(array[i])
это будет преуспевать в функции, а не выступать в качестве ее аргумента.
Ответ №1:
Позвольте мне переписать этот код более явным образом:
function forEach(array, action) { //1st parameter is an array, the 2nd is a function
for (var i = 0; i < array.length; i )
action(array[i]); //The function is used, with each element of the array as parameter
}
var numbers = [1, 2, 3, 4, 5], sum = 0;
var myFunction= function (number) { //I declare a function which receives a number
sum = number; //and adds it to sum.
}
forEach(numbers,myFunction); //I call the forEach function using the
// variables I previously created as parameters
console.log(sum);
Комментарии:
1. Это такое простое объяснение. Видя, что это написано таким образом, сразу же высвечивает ошибки в моем непонимании. Спасибо.
Ответ №2:
В javascript при определении переменной вы пишете:
var x = 0; // here you reserve an object
И когда вы определяете функцию, вы также резервируете объект. Javascript обрабатывает функции как объекты, и вы можете присвоить их любой переменной:
var x = function(number){ sum =number; };
forEach (numbers, x(number) );
И о запутанном синтаксисе, анонимные функции — это функции, которые динамически объявляются во время выполнения. Они называются анонимными функциями, потому что им не присваивается имя так же, как обычным функциям.
Итак, чтобы вызвать анонимную функцию, вы следуете этому синтаксису:
// call
function (param1, param2, ...){
// function body
}
если вы хотите вызвать ее снова, вам следует либо повторить приведенный выше код, либо объявить функцию без ее вызова и сохранить ее в переменной, где вы можете вызывать ее много раз:
// declaration
var x = function(param1, param2, ...){
// body
};
// call
x(p1,p2,....);