try/catch表达式中的var关键字:JSLint错误还是全局赋值?

koj*_*iro 9 javascript scope global-variables

在研究codereview问题时,我注意到了JSLint的一个有趣结果.JSLint抱怨在定义变量之前使用了变量.这是一个产生相同结果的缩短版代码:

(function () {
    try {
        var a = 0;
        throw { name: "fakeError" };
    } catch (e) {
        a = 1;
    }
}());
Run Code Online (Sandbox Code Playgroud)

我对JavaScript的理解说上面的代码应该等同于:

(function () {
    var a;
    try {
        a = 0;
        throw { name: "fakeError" };
    } catch (e) {
        a = 1;
    }
}());
Run Code Online (Sandbox Code Playgroud)

实际上,a当通过Firebug运行时,这两个示例都不会导致存在于全局范围内.我看了一下ECMA-262规范的第12.14节,但是我没有看到任何会让我认为应该区别对待功能的东西.这只是JSLint中的一个错误,还是两个表达式在功能上有所不同?

Lee*_*ski 5

这只是一个错误,但是如果你把所有的var语句都移到了顶层,JSLint的默认选项会更喜欢它.