Javascript try/catch表达式中的var关键字:JSLint bug还是全局赋值?
我在研究一个问题时注意到了一个有趣的结果。JSLint抱怨在定义变量之前使用了它。下面是产生相同结果的代码的简化版本: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 {
(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
}