2012-01-19 12 views
2

は、次のコードを考えてみましょう:私はJSLintでこれをチェックするとJSスコープ問題

function processParagraph(paragraph) { 
    if (paragraph.charAt(0) === '%') { 
     for (var level = 0; paragraph.charAt(level) === '%'; level++) {} 

     return { 
      type: 'h' + level, 
      content: paragraph.slice(level + 1) 
     }; 
    } 

    return { 
     type: 'p' + level, 
     content: paragraph 
    }; 
} 

、それは第二return文でlevelused out of scope.であることを不平を言います。

なぜですか? AFAIK、JavaScriptにはレキシカルスコープ/機能スコープがあります。ネストされた関数がないので、コードは完全に有効でなければなりません。または私は何かを逃していますか?

+1

paragraph.charAt(0)が '%'と等しくない場合の 'レベル'の値は何ですか?最初の "レベル"の宣言はifステートメント内にあるので、決して定義されていない変数を使用する可能性について不平を言っているかもしれません。 – adelphus

+0

JSLintがこの変数について不平を言ってもよろしいですか?このコードは正しいです。 Btw関数の初めに変数を宣言する方が良いでしょう。なぜなら、このコードは読みにくいからです。 –

答えて

2

1つの変数は、varを使用して定義されていますが、関数全体に表示されます。

あなたが持っているものは決して定義されていなくても、最終的な返品でlevelを使用します。

私は、関数の先頭に

var level = 0; 

...を入れ、forループでそれを宣言しないでしょう。

1

おそらく、levelは設定されておらず、他の実行パスに使用されていることを意味します。

2

JSLintは、Lintであり、単純な構文チェッカーではありません。

ファンクションレベルのスコープは、多くの開発者が慣れていないし、期待しないものです。 JSLintの著者は、ブロックスコープが使用された場合でも互換性があるような方法で変数を宣言するのは良いスタイルだと考えています。