2015-08-11 3 views
3
function multiplier(factor) { 
    return function(number) { 
    return number * factor; 
    }; 
} 

var twice = multiplier(2); 
console.log(twice(5)); 
//output 10 

Может кто-нибудь объяснить, почему параметр 'number' не возвращается как неопределенный? Мне действительно трудно понять, как определить переменную «дважды» как функцию с фиксированным значением 2, поскольку ее параметр затем может использоваться как функция с пассивным параметром 5?Ошибки в работе функции блокировки

+0

Вернулся, как определен в какой момент? – crush

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures – SLaks

ответ

2

В первом вызове вы передаете и фиксируя параметр фактора:

var twice = multiplier(2); 

Параметр становится «фиксированной», так как функция, возвращаемая multiplier захватывает factor значение переменной, то ссылка на factor теряется после возвращается функция multiplier, поэтому factor больше не изменится.

(см closures на MDN)

twice теперь является функция, как это:

function(number) { 
    return number * 2; 
} 

Во втором вызове вы затем с помощью функции twice проходящих 5 в качестве параметра числа.

2

определения переменной «дважды» как функцию с фиксированным значением 2 в качестве его

Thats не то, что вы делаете там. Twice - это просто указатель (reference) функции (closure) внутри multiplier.

+3

'reference' not pointer: P – crush

+1

Позволяет хранить все в простых условиях C :) Нет. Вы правы. Указатель - не правильный термин. – Matthias

4

Короткий ответ:

Если у вас есть var twice = multiplier(2); такие же, как: twice = function (number) {return number * 2};

Представьте себе, что мультипликатор представляет собой класс, который имеет свойство factor (требуется для инициализации объекта), и когда мультипликатор при инициализации он возвращает функцию, которая принимает значение number и умножается на factor.

1

Это поведение javascript называется закрытием и самым простым способом замыкание - это постоянная локальная переменная, которая позволяет вам получить доступ к переменным, которые уже скончались при выполнении.

Так как в вашем примере фактор является локальным для функции множителя. Но ваша внутренняя функция захватывает его и использует для вычисления умножения. В это время фактор становится замыканием и не удаляется из памяти. Затем, когда вы вызываете внутреннюю функцию (которая возвращается) с помощью 5, она использует захваченное значение переменной 2, чтобы получить значение 10. Здесь коэффициент является закрытием.

Затворы хорошо объясняются в «JavaScript хороших части Дугласа Крокфорда в» книге и http://javascriptissexy.com/understand-javascript-closures-with-ease/, если вы хотите узнать больше ..

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