8

JSLintを介して実行すると、javascriptが私に怒鳴りますが、その理由はわかりません。

/*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)です。なぜこれが問題になるのでしょうか?catch ブロック内のローカル変数に単に e を設定していませんか? 関数内でトラップされたすべてのエラーに対して、ローカル変数に一意の名前を付ける必要がありますか?

4

5 に答える 5

9

JSLint に対して、ローカル変数としてtry..catch宣言するという暗黙の効果があります。e同じ関数内にそのようなブロックが 2 つあるため (JavaScript にはブロック スコープがありません)、JSLint は、既に宣言されている変数を宣言していると見なします。

などの変数e1に名前を付けると、JSLint からのこの警告が防止されます。それは本当に問題ですか?ECMAScript 5 仕様のセクション 12.14 には、「制御がどのようにブロックを離れても、LexicalEnvironment は常に元の状態に復元される」と記載されています。実際、これは事実のようです:e2

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

try / catch ごとに異なる変数を使用します。

于 2010-11-17T21:51:11.787 に答える