2015-12-10 4 views
2

В красноречивый 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 

ответ

1

Думай об этом, как это:

var twice = function(number) { 
     return number * 2; 
    }; 

Когда вы вызываете множитель (2), вы создаете новую функцию, которая вставляет фактор в эту новую функцию.

Смежные вопросы