4

/ループでループ固有の変数を宣言するための適切な構文は何ですか?forin

最初の2つは両方とも機能しているように見えます(そしてGoogle ClosureCompilerではフラグを立てません)が、3つ目だけがCrockfordのJSLintを通過します。コンパクトではないので、使いたくありません。

JSLintvalは、変数が不正であるか(追加しない場合var)、宣言を移動する必要があると文句を言います。

最初または2番目のオプションに欠点はありますか?何を使うべきですか?str(例では、が宣言された文字列であり、宣言されたオブジェクトであると想定していvalsます)

1.宣言なし:

for(val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}

2.'for' var宣言の場合:

for(var val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}

3.ループ変数宣言の外側:

var val;
for(val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}
4

3 に答える 3

3

JSLint は無視してかまいません。何よりもガイドラインです。2nd と 3rd は機能的には同じなので、どちらを使っても構いません (私は 2nd を使います)。最初はグローバルな「val」変数を公開するので、それをしないでください:)

参考までに、3 番目の背後にある理由は、インライン変数宣言は、以下よりも見つけたり見つけたりするのがはるかに難しいということです。

var a, b, c, d, e;

関数の先頭。

于 2011-03-28T20:02:42.147 に答える
1

変数宣言の背後にある cwolves の推論に加えて、JSLint は変数ホイストも検討しています。

そうは言っても、 for ループを書くときはオプション #2 を好みます。ただし、関数の先頭で残りの変数を定義します。だから私は好きです:

function foo(a) {
  var b, c = {d: "e", f: "g"};

  for (var i = 0, j = a.length; i < j; i += 1) {
    ...
  }

  for (var h in c) {
    if (c.hasOwnProperty(h)) {
      ...
    }
  }      
}
于 2011-03-28T20:11:34.650 に答える
1

1.オプション

val変数は暗黙のグローバル変数になります。暗黙のグローバル変数は 100% 悪いものであり、避けるべきです。

2. および 3. オプション

val変数は、包含スコープの変数になります。コードが関数内にある場合、val変数はその関数のローカル変数になります。どちらのオプションも同等です。(私は 2. オプションを好みます。)

Crockford 氏の考えは、常にすべての変数をコードの先頭で宣言することであるため、JSLint はスローします。これは、サイズが大きいコード (> 100 行など) の場合により意味があります。その場合、宣言を for ステートメントと for-in ステートメントの外に移動し、コードの先頭に配置することを検討できます。そうすれば、すべてのローカル変数の概要を把握できます。

于 2011-03-28T20:17:53.950 に答える