2

有时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

为什么?这背后的逻辑是什么?

4

1 回答 1

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不是有时被提前解析,有时不是。问题是文件除了全局之外没有其他范围。

于 2013-04-09T17:23:56.483 回答