Когда анализируется "var"?
Иногда var
влияет на код перед ним, а иногда и нет. Возьмите этот пример:
base.jsx:
$.global.a = 1;
$.writeln("a: " + a);
var a = 2;
Запуск этой печати a: 1
, Бег $.evalFile("base.jsx");
также печатает a: 1
, Тем не менее, работает
(function() {
$.evalFile("base.jsx");
})();
печать a: undefined
,
Зачем? Какая логика стоит за этим?
1 ответ
После нескольких испытаний я разобрался.
Я знал, что области действия JavaScript - на уровне функций, но я предполагал, что файлы также имеют свою собственную область. Я был неправ.
Бег
$.global.a = 1;
var a = 2;
$.writeln("$.global.a: " + $.global.a);
распечатает $.global.a: 2
, Это означает, что $.global.a
а также var a
в этом контексте одно и то же, и область действия файла на самом деле является глобальной областью действия.
Учитывая, что base.jsx все еще
$.global.a = 1;
$.writeln("a: " + a);
var a = 2;
Выполнение кода
(function() {
$.evalFile("base.jsx");
$.writeln("a: " + a);
$.writeln("$.global.a: " + $.global.a);
})();
изменяет область действия base.jsx на эту функцию вместо глобального объекта. Вдруг $.global.a
а также var a
имеют в виду два разных объекта. Результатом этого будет:
a: undefined
a: 2
$.global.a: 1
Так что проблема никогда не была var
иногда анализируется рано, а иногда нет. Проблема заключается в том, что файлы не имеют другой области видимости, кроме глобальной.