function f() { return s; } // works fine though no `s` is defined yet !
var s=1;
f(); // 1
delete s;
var s=2;
f(); // 2
(function() {
var s=3;
f(); // 2 and not 3 which means lexical scoping is at play (?)
})();
во-первых, вы можете закрыть переменную (s
), которая еще не определена. Как это возможно, если используется лексическая (статическая) область видимости?
во-вторых, после удаления исходного s
f()
может найти новый s
. Означает ли это, что замыкания привязаны к именам переменных, а не к ссылкам или индексам таблицы символов или к чему-то более машинному? Я ожидаю, что закрытие лексической области видимости вызовет ошибку, поскольку исходный s
удален. Новый s
просто повторно использует имя и не имеет ничего общего с исходным s
.
И в-третьих, s
внутри области анонимной функции не используется f()
, значит ли это, что лексическая область видимости действительно задействована?
(function() { ...code... })();
. Затем попробуйте исходный код, за исключением оператора"use strict";
(только эта строковая константа) в самом верху. - person Pointy   schedule 29.03.2013"use strict";
, вероятно, самая интересная.) В любом случае, да, все дело в лексической области видимости. - person Pointy   schedule 29.03.2013delete
просто не будет работать. - person Pointy   schedule 29.03.2013