2

次のコードを検討してください。

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
    };
}

これを JSLint で確認するとlevel、2 番目の return ステートメントがused out of scope..

しかし、なぜ?私の知る限り、JavaScriptにはレキシカルスコープ/関数スコープがあります。ネストされた関数がないため、コードは完全に有効である必要があります。または、何か不足していますか?

4

3 に答える 3

2

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

関数レベルのスコープは、多くの開発者が慣れておらず、予期していないことです。JSLint の作成者は、ブロック スコープが使用された場合でも互換性が保たれるような方法で変数を宣言するのは良いスタイルだと考えています。

于 2012-01-19T14:28:04.567 に答える
2

それを使用して定義された変数はvar、関数全体に表示されます。

そこにあるものはlevel、定義されていなくても、最終的な戻り値で使用されます。

私は置くだろう

var level = 0;

...関数の先頭で、for ループで宣言しないでください。

于 2012-01-19T14:19:30.670 に答える
1

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

于 2012-01-19T14:18:59.113 に答える