JSLint抱怨我的try / catch

时间:2010-11-17 19:39:15

标签: javascript exception-handling error-handling try-catch jslint

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

5 个答案:

答案 0 :(得分:9)

对于JSLint,try..catch具有将e声明为局部变量的隐含效果。因为在同一个函数中有两个这样的块(JavaScript中没有块作用域),JSLint将其视为声明已声明的变量

命名变量e1e2可以防止来自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块内有效,并且未在外部定义。这里没有重新定义。