Сообщение от 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]] замыкаемой функции, которая возникает , если ссылка на функцию сохраняется вне Контекста охватывающей функции и мы захотим вызвать функцию Извне ее Охватывающего Контекста по этой ссылке.