как работает закрытие при объявлении анонимных функций в вызовах javascript (jquery)?

#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».