Когда анализируется "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 иногда анализируется рано, а иногда нет. Проблема заключается в том, что файлы не имеют другой области видимости, кроме глобальной.

Другие вопросы по тегам