【问题标题】:JSLint complaining about my try/catchJSLint 抱怨我的 try/catch
【发布时间】:2011-05-11 15:21:24
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 看来你是对的。我想 try/catch 确实引入范围,正如我提出的这个快速测试所证明的那样:jsfiddle.net/VRcwV
    • 哦,刚刚看到编辑!所以它没有引入作用域,但是由 catch 语句创建的局部变量在该 catch 之外是不可用的。所以它确实为那个例外引入了一点专门的范围?
    • @Squeegy:似乎 IE 8 兼容。在该浏览器中尝试我的测试 (jsfiddle.net/DpHMt),您会看到 两个 警报框都打开了。
    【解决方案2】:

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

    【讨论】:

    • 据我所知e没有保留。
    【解决方案3】:

    JSLint I use 没有显示任何错误 - 逻辑上您的代码是正确的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • ECMAScipt 规范,当然。但是浏览器实现,显然不是:jsfiddle.net/VRcwV
      • @Squeegy:只有异常变量e 进入新范围。用var 声明的变量总是在函数范围内。试试alert(e),你会发现它在catch 块之外是未定义的。
      【解决方案5】:

      为每个 try/catch 使用不同的变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-15
        • 2011-12-31
        • 2011-07-13
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2012-03-28
        相关资源
        最近更新 更多