javascript - JSLint 提示我的 try/catch

标签 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();

它告诉我:

Problem at line 12 character 11: 'e' is already defined.

} catch(e) {

我有第二个 catch(e) 似乎很沮丧。为什么这会成为一个问题?它不是简单地将 e 设置为 catch block 内的局部变量吗?我是否需要为函数中所有捕获的错误唯一命名局部变量?

最佳答案

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

将变量命名为 e1e2etc. 将阻止 JSLint 发出此警告。这真的是个问题吗? ECMAScript 5 规范第 12.14 节说“无论控制如何离开 Block,LexicalEnvironment 总是恢复到它以前的状态。”事实上,情况确实如此:

try {
    throw new Error("testing 1234");
} catch(fooBarBaz){
    alert("Catch: " + fooBarBaz);    // works
}

alert(fooBarBaz);    // throws exception

因此,总而言之,这只是JSLint 的限制,不太可能导致任何实际问题。

关于javascript - JSLint 提示我的 try/catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4208407/

相关文章:

javascript - 如何将所有行读入第三级 jqgrid/subGrid。请看图片

dynamics-crm-2011 - 如何通过 Javascript 更新 Microsoft CRM Online 上的表单字段

javascript - Angular 2,查找数组中接下来的几个元素

exception-handling - 将单个 Elmah.axd 用于具有单个 DB 日志的多个应用程序

c# - 在Gtk#应用程序中将全局异常处理程序放在哪里?

vba - 在PowerPoint图表中更改数据标签格式

javascript - 如何在 React 中加载和使用 jsgrid lib?

C++ 通过继承 std::exception 创建新的异常

c# - 是否存在适合使用空 catch block 的情况?

python - 如何在pygame 64位退出窗口?