什么时候解析“var”?

时间:2013-04-09 15:45:19

标签: adobe adobe-indesign extendscript adobe-javascript

有时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 个答案:

答案 0 :(得分:1)

经过一系列的测试后,我发现了它。

我知道JavaScript的范围是功能级别的,但我假设文件也有自己的范围。我错了。

运行

$.global.a = 1;
var a = 2;
$.writeln("$.global.a: " + $.global.a);

将打印$.global.a: 2。这意味着$.global.avar 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.avar a指的是两个不同的对象。结果将是:

a: undefined
a: 2
$.global.a: 1

所以问题从来都不是var有时会提前解析,有时也不解析。问题是文件没有全局范围。