有时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
。
为什么呢?这背后的逻辑是什么?
答案 0 :(得分: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
有时会提前解析,有时也不解析。问题是文件没有全局范围。