代码之家  ›  专栏  ›  技术社区  ›  Alex Wayne

JSLint抱怨我的尝试/捕获

  •  8
  • Alex Wayne  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  9
  •   PleaseStand    14 年前

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

    命名变量 e1 , e2 , 等。 将阻止JSLint发出此警告。但这真的是个问题吗?ECMAScript 5规范,第12.14部分说:“不管控制如何离开块,词汇环境总是恢复到原来的状态。”事实上,这似乎是这样的:

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

    所以,总结一下,这只是 JSLint的限制 也不太可能导致任何实际问题。

        2
  •  0
  •   Darren    14 年前

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

        3
  •  0
  •   pex    14 年前

    这个 JSLint I use 显示完全没有错误-逻辑上你的代码是正确的。

        4
  •  0
  •   RussellUresti    14 年前

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

        5
  •  0
  •   casablanca    14 年前

    JSLint可能是错的。根据ECMAScript规范,输入 catch 块创建定义异常变量的新作用域。在你的例子中, e 仅在 抓住 块,未在外部定义。这里没有重新定义。