Показать сообщение отдельно
  #61 (permalink)  
Старый 17.04.2009, 00:25
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

Сообщение от Dmitry A. Soshnikov
это динамическая цепь (есть ещё и статическая
Чем дальше в сказку, тем страшнее ...

Цитата:
Найденное в Scope chain значение, всегда будет последним присвоенным (связанным) значением этой переменной. Чтобы это предотвратить (а такие случаи бывают нужны - например, при замыкании счетчика цикла) - создают новую функцию с новым VO - т.е. передают нужное значение (счетчик цикла) параметром в создаваемую функцию.
Не понял, к чему это здесь ?..

Цитата:
Зачем Здесь хранить Scope Chain (b)
Ну а как? - в "d" есть свободные переменные.
Ну и пусть есть , ведь далее при повторном вызове savB(); // 40
из того же контекста где эти переменные известны мы же однозначно их определяем ?..

Впрочем, вот сам опровергну свои слова, хотя не понимаю, зачем так сделано :
var a = 10;
function b(x) {
  var c = 20; 
  // Здесь пытаемся вызвать из контекста b, в котором однозначно какзалось бы определяются все значения VO(b)
  if (x) { a=5; c=7; x(); return  } ; // 30,0,5 <- НИКАКОГО влияния нового c==7 ! осталось старое законсервированное c==0
  function d() {
    var e = 30;   al( [e ,c , a ]);
  };
  // Замыкаем на savB
  var savB=d; // Scope Chain (b) === [[Scope]](d)    Зачем Здесь хранить Scope Chain (b)  ?
  savB(); // 30,20,10
  c=0;    // Если бы VO(b) законсервировался при замыкании, то это изменение 
          // НЕ оказало бы воздействия на последующий вызов через Замыкание: 
  savB(); // 30,0,10  <- Scope Chain (b), т.е. VO(b) - не законсервировался, т.к.
          // здесь вызов почувствовал (?) изменение с с=20 на --> c=0 
          // НО ПОЧЕМУ ????????????????? ЗДЕСЬ [[Scope]](d) НЕ СОХРАНИЛСЯ 
  b(savB); // 30,0,5 <- А вот так НЕ почувствовал с=7 , хотя контекст b, казалось бы мог сам определить свои значения, Караул !!!
  return savB;
};
var s=b(); 
//s();      // 30,0,10 <- Scope Chain (b), т.е. VO(b) - Законсервировался, но Global - нет.
// b(s);     // 30,0,5
s();      // 30,0,5


Но уж Global'то VO - никогда не консервируется при замыканиях ?!

PS. Можно еще пояснить вопрос НО ПОЧЕМУ?????????? в примере ?
Просто я считал, что
Замыкание необходимо для разрешения неоднозначности значений локальных переменных из [[Scope]] замыкаемой функции, которая возникает , если ссылка на функцию сохраняется вне Контекста охватывающей функции и мы захотим вызвать функцию Извне ее Охватывающего Контекста по этой ссылке.

Последний раз редактировалось kefi, 17.04.2009 в 00:41.
Ответить с цитированием