В красноречивый JavaScript, автор дает следующий пример + прозу:красноречив Javascript - Закрытие и функции
с небольшим изменением, мы можем превратить предыдущий пример в способ создавать функции, которые размножаются с помощью произвольная сумма.
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
// → 10 The explicit
localVariable из примера wrapValue не нужен, так как параметр сам по себе является локальной переменной.
Думая о программах, подобных этому, требуется определенная практика. Хорошая умственная модель должна думать о ключевом слове функции как о «замораживании» кода в его корпусе и обертывании его в пакет (значение функции). Поэтому, когда вы читаете функцию возврата (...) {...}, подумайте об этом, возвращая дескриптор в кусок вычислений, замороженный для последующего использования.
В примере множитель возвращает замороженный фрагмент кода, который получает , хранящийся в переменной дважды. Последняя строка затем вызывает значение в этой переменной, в результате чего замороженный код (номер возвращаемого номера *) должен быть активирован . Он по-прежнему имеет доступ к факторной переменной из вызывающего множителя , который его создал, и, кроме того, он получает доступ к аргументу , переданному при размораживании его 5 посредством его номера параметра.
каким образом Javascript знает, что 5 в:
console.log(twice(5));
, предполагают, чтобы быть значение числа? Является ли JavaScript, по сути говоря, «я уже имею 2 как значение для фактора, и я не могу его изменить, поэтому 5 должно быть значением для числа».
Другими словами
var twice = multiplier(2)
so twice = multiplier(2) {return function (number)}
thus twice(5) = multiplier(2) {return function (5)}
Правильно ли это?
если есть другая локальная переменная внутри мультипликатора, я мог назвать:
twice(5,10)
и Javascript будет знать, что означает:
factor = 2
number = 5
third variable = 10