Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript try/catch表达式中的var关键字:JSLint bug还是全局赋值?_Javascript_Scope_Global Variables - Fatal编程技术网

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

Javascript try/catch表达式中的var关键字:JSLint bug还是全局赋值?,javascript,scope,global-variables,Javascript,Scope,Global Variables,我在研究一个问题时注意到了一个有趣的结果。JSLint抱怨在定义变量之前使用了它。下面是产生相同结果的代码的简化版本: (function () { try { var a = 0; throw { name: "fakeError" }; } catch (e) { a = 1; } }()); 我对JavaScript的理解是,上述代码应等同于: (function () { var a; try {

我在研究一个问题时注意到了一个有趣的结果。JSLint抱怨在定义变量之前使用了它。下面是产生相同结果的代码的简化版本:

(function () {
    try {
        var a = 0;
        throw { name: "fakeError" };
    } catch (e) {
        a = 1;
    }
}());
我对JavaScript的理解是,上述代码应等同于:

(function () {
    var a;
    try {
        a = 0;
        throw { name: "fakeError" };
    } catch (e) {
        a = 1;
    }
}());

事实上,当运行Firebug时,这两个示例都不会导致
a
存在于全局范围内。我看了第12.14节,但没有看到任何东西会让我认为应该对函数进行不同的处理。这只是JSLint中的一个bug,还是这两个表达式在功能上有所不同?

这只是一个bug,但是JSLint的默认选项更倾向于将所有var语句移到顶部。

而将一些代码块括在大括号中
{…}
只是没有在javascript中创建新的作用域,
捕获
是一个例外,如
中所述。与外部代码相比,catch块内部的代码具有不同的作用域。它被视为内部范围内的函数

换言之,如上所述:

catch块是唯一的,因为JavaScript在输入catch块时创建此标识符,并将其添加到当前范围中;标识符仅在catch块的持续时间内有效;catch块完成执行后,标识符不再可用

正如您所知,在javascript中,不能期望变量从两个不同的代码范围提升。因此,JSLint抱怨是因为他/她;-)我知道这一点

function f() {
  try {
    throw "foo";
  } catch (e) {
  }
  // e undefined here
}