javascript在JSLint运行时对我大吼大叫,我不确定原因。
/*jslint browser: true, devel: true, evil: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, newcap: true, immed: true */
var foo = function() {
try {
console.log('foo');
} catch(e) {
alert(e);
}
try {
console.log('bar');
} catch(e) {
alert(e);
}
};
foo();
它告诉我:
第12行问题11:'e'已经定义。
} catch(e) {
我有第二个catch(e)
似乎很不高兴。为什么这会成为问题?它不是简单地将e设置为catch块内的局部变量吗?我是否需要为函数中所有陷阱错误唯一命名局部变量?
答案 0 :(得分:9)
对于JSLint,try..catch
具有将e
声明为局部变量的隐含效果。因为在同一个函数中有两个这样的块(JavaScript中没有块作用域),JSLint将其视为声明已声明的变量。
命名变量e1
,e2
,等可以防止来自JSLint的此警告。这真的是个问题吗? ECMAScript 5规范第12.14节说:“无论控制如何离开Block,LexicalEnvironment总是恢复到以前的状态。”事实上,事实确实如此:
try {
throw new Error("testing 1234");
} catch(fooBarBaz){
alert("Catch: " + fooBarBaz); // works
}
alert(fooBarBaz); // throws exception
因此,总而言之,这只是JSLint的限制,不太可能导致任何实际问题。
答案 1 :(得分:0)
JSLint I use根本没有显示任何错误 - 并且您的代码是正确的。
答案 2 :(得分:0)
尝试使用另一个变量,可能会让人感到困惑,因为e通常是为事件处理程序保留的。
答案 3 :(得分:0)
为每个try / catch使用不同的变量。
答案 4 :(得分:0)
JSLint可能在这里错了。根据ECMAScript规范,输入catch
块会创建一个新范围,在该范围内定义异常变量。在您的示例中,e
仅在catch
块内有效,并且未在外部定义。这里没有重新定义。