Цитата:
P.S.: надо бы сделать тег зачёркивания. |
Тут еще интересно c чисто хозяйственной точки зрения :
а сохраняется ли [[Scope]] (d), если функция d не содержит переменных из своего [[Scope]], в этом случае вроде как бы оно и не нужно тратить память ? Правда практически на тестах это не проверить никак .
var a = 10;
function b() {
var c = 20;
function d() {
var e = 30; alert( e);
}
d();
return d;
}
var sav=b();
|
Цитата:
Цитата:
function a() {
var b = 10;
function c() {
function d() {
alert(b);
}
}
}
Функция "с" не использует переменные из внешнего VO (ещё говорят: не имеет свободных переменных). Однако, функция "d" - использует. И черпает из Scope, частью которого является [[Scope]] (т.е. Scope вышестоящего контекста). Для "d", [[Scope]] - это Scope(c), и если в "c" не будет ссылки на вышестоящий контекст (где находится "b"), "d" не увидит "b". |
Цитата:
И еще аналогичный вопрос : А сохраняется ли Scope Chain контекста в котором мы сделали замыкание? Тоже, вроде как, ни к чему . Т.е.
var a = 10;
function b() {
var c = 20;
function d() {
var e = 30; alert( e);
}
d();
var savB=d; // Scope Chain (b) === [[Scope]](d) Здесь сохранится ?
return d;
}
var sav=b();
|
Да, сохраняется. В спецификации ничего по этому поводу не сказано, сказано лишь, что [[Scope]] однозначно записывается в функцию при её создании. Однако, может, какие-то реализации могут делать оптимизацию (только в однозначно определённых случаях, когда точно известно, что функция не использует ничего извне), но это лишь предположение. С другой стороны, в функции может стоять if, внутри которого будет eval(...), использующий свойства из [[Scope]]. Или же функция может вызывать себя рекурсивно по имени (имя также находится в [[Scope]]).
|
2 Dmitry A. Soshnikov> Это ответ на первый или второй вопрос, во втором случае вроде как незачем сохранять Scope Chain ?
var a = 10;
( function b() {
var c = 20;
function d() {
var e = 30; alert( e+c+a);
}
d();
var savB=d; // Scope Chain (b) === [[Scope]](d) Зачем Здесь хранить Scope Chain (b) ?
return d;
} ) ()
|
Цитата:
Возможно, какая-нибудь из реализаций не сохраняет [[Scope]] для оптимизации в функции вида function a() {}. Но, ещё раз, в спецификации ничего не сказано об этом. |
Цитата:
Может он-то и записывается , но записывается ссылка на него, но его содержимое ... , короче, вот :
var a = 10;
function b() {
var c = 20;
function d() {
var e = 30; al( e+c+a);
};
// Замыкаем на savB
var savB=d; // Scope Chain (b) === [[Scope]](d) Зачем Здесь хранить Scope Chain (b) ?
savB(); // 60
c=0; // Если бы VO(b) законсервировался при замыкании, то это изменение
// не оказало бы воздействия на последующий вызов через Замыкание:
savB(); // 40 <- Scope Chain (b), т.е. VO(b) - не законсервировался
return savB;
};
var s=b();
s(); //40 <- Scope Chain (b), т.е. VO(b) - Законсервировался, но Global - нет.
|
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
| Часовой пояс GMT +3, время: 06:25. |