2010-07-11 2 views
2

Пример:Как сделать эту анонимную функцию Javascript ссылкой на правую переменную?

var o = {}; 
for(var i = 0; i < 5; i++) { 
    o[i] = function() { 
     console.log(i); 
    }; 
} 

o[3](); 

Когда я звоню O3, он всегда будет отображать 5 на консоли, даже если я называю о0, o4, или любой из них. Он всегда будет отображать 5, потому что это последнее значение, которое у меня было. Как заставить его отображать значение i при выполнении анонимной функции? Как и в o3, нужно отобразить 3 в консоли.

ответ

5

Вы должны сделать:

var o = {}; 
for(var i = 0; i < 5; i++) { 
    (function(i) { // <- self-executing anonymus function with a parameter i 
    o[i] = function() { 
     console.log(i); // <- i here will be the argument i, 
         // not the i from the loop 
    }; 
    })(i); // <- pass i as an argument 
} 

o[3](); 

Что происходит, что вы создаете нечто, называемое закрытие с тем, чтобы сохранить состояние я.

Закрытие означает, что внутренняя функция сохраняет ссылку на внешней функции и так получает доступ к его переменным и параметрам (даже после того, как внешней функция вернула).

Тривиальный пример для закрытия является:

function outer(arg) { 
    var variable = 5; 
    arg = 2; 
    function inner() { 
    alert(variable); // <- the inner function has access to the variables 
    alert(arg);  //  and parameters of the outer function 
    } 
} 

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

(function() { 
    alert("executed immediately"); 
})(); 

Сочетание обоих и тот факт, что только функции имеют сферы в Javascript, приводит вас к технике, упомянутой выше, чтобы создать сферу с новой функцией, которая сохраняет состояние я, который в противном случае был бы изменен внутренней функцией из-за закрытия.

+0

Спасибо, что сработали. – fent

1
o[i] = (function (i) { 
    return function() { console.log(i); } 
})(i); 

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

  • Нет связанных вопросов^_^