Может кто-нибудь объяснить мне поток этой функции JavaScript? (Закрытие концепции)
Я читаю " Красноречивый JavaScript". Глава 3 знакомит с концепцией " Закрытие" и дает вам пару примеров. Один из них следующий:
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
// → 10
Я думаю, что понял концепцию. Если сначала я выполню console.log(twice)
, поскольку переменная number
не определено, что я получаю [Function]
, Что я не понимаю, так это как twice(5)
работает. Почему локальная переменная number
инициализируется со значением 5
?
Кроме того, почему, если я выполню console.log(multiplier(2,5))
Я не получаю 10 в результате?
Благодарю.
3 ответа
Так как multiplier
возвращает функцию, так twice
равно возвращаемой функции, а НЕ multiplier
функция.
Однако когда multiplier
называется factor
переменная передается и используется в возвращаемой функции.
Чтобы было легче понять, учтите, что twice
в основном:
var twice = function(number) {
return number * 2;
};
куда factor
было заменено значением, которое вы передали при вызове multiplier(2)
,
Я думаю, что понял концепцию. Если сначала я выполню
console.log(twice)
, поскольку номер переменной не определен, то, что я получаю[Function]
,
Когда вы используете console.log(twice)
вы на самом деле не вызываете функцию twice
Вы просто регистрируете значение этого. Так что выход [Function]
не потому что number
не определено, это потому, что вы выводите реальную функцию, а не ее результат.
Кроме того, почему, если я выполню
console.log(multiplier(2,5))
Я не получаю 10 в результате?
Здесь вы звоните multiplier
предоставив 2 аргумента, хотя вы определили функцию для приема только одного параметра (factor
). В javascript это не вызовет ошибку, но вы просто получите первое сопоставленное значение factor
(factor = 2
).
Примечание. Существуют способы получить доступ ко всем предоставленным аргументам, даже если для них не определены параметры ( вот пример)
То, что можно было бы получить в результате 10
что может представлять интерес - использовать следующий код:
var result = multiplier(2)(5); // result = 10
Множитель - это функция, которая возвращает анонимную функцию, которая принимает аргумент (число)
var twice = multiplier(2);
В основном это:-
var twice = function(number) {
return number * 2;
};
Если вы выполните
console.log(multiplier(2,5))
Вы вызываете функцию, дающую два параметра, тогда как
function multiplier(factor) {}
принимает только один параметр.