8

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 块内的局部变量吗?我是否需要为函数中所有捕获的错误唯一命名局部变量?

4

5 回答 5

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 的一个限制,不太可能导致任何实际问题。

于 2010-11-17T21:49:32.893 回答
0

我使用的JSLint没有显示任何错误 - 并且您的代码是正确的。

于 2010-11-17T21:40:47.683 回答
0

尝试使用不同的变量,可能会感到困惑,因为 e 通常是为事件处理程序保留的。

于 2010-11-17T21:41:15.180 回答
0

JSLint 在这里可能完全是错误的。根据 ECMAScript 规范,输入一个catch块会创建一个新的范围,其中定义了异常变量。在您的示例中,e仅在catch块内部有效,并且未在外部定义。这里没有重新定义。

于 2010-11-17T21:58:56.617 回答
-1

为每个尝试/捕获使用不同的变量。

于 2010-11-17T21:51:11.787 回答