#javascript #jquery
#javascript #jquery
Вопрос:
В этой функции:
var x = {
getStuff : function(){
var i = 0;
$.getJSON('/url.json', {}, function(data){
$.each(data, function(key,val){
alert(i);
});
});
});
}
Итак, я правильно понимаю, что анонимные функции, объявленные для двух вызовов jquery (.getJSON, .each), обе имеют доступ к родительской функции (GetStuff) из-за закрытия?
Означает ли это, что анонимные функции, объявляемые в этом расположении, находятся в цепочке областей видимости своего родителя, поэтому у них есть доступ к родительским переменным?
Ответ №1:
Анонимные функции не имеют доступа к самому «GetStuff()» по этому имени, кроме как через переменную «x». Они действительно имеют доступ к переменной «i», или, более правильно, к переменной «i» в экземпляре локальной области видимости содержащей функции для вызова, в котором были созданы экземпляры анонимных функций.
Каждый вызов «GetStuff()» создаст новую локальную область, каждая со своим собственным «i» и своими собственными анонимными функциями.
Комментарии:
1. Итак, когда вы говорите о его собственном «i», если я изменю это «i», изменится ли оно во всех объектах, которые ссылаются на переменную «x» из-за буквального синтаксиса?
2.@James: Нет — при входе в контекст выполнения функций создается новый VariableObject (VA) с новыми свойствами (связанными, например, с i) — этот объект будет помещен в цепочку областей видимости для любых функций, созданных / введенных в этом контексте, и поэтому они будут иметь доступ к этому конкретному экземпляру i. Но при каждом вводе функции формируется новая область видимости.
3. @James то, что Шон написал выше, верно. Каждый вызов «GetStuff()» выделяет новый блок памяти, что означает новый «i».