58

if ステートメント内で JavaScript 変数を定義することは正しいですか?

if(a==1){
    var b = 1;
} else {
    var b = 0;
}

上記のコードが機能することはわかっていますが、WebMatrix は変数を強調表示します。

if ステートメントの外で変数を定義する必要がありますか? それとも最初の選択肢が正しいですか?それともあまり関係ない?

var b = '';
if(a==1){
    b = 1;
} else {
    b = 0;
}
4

5 に答える 5

71

ES2017 仕様の公式リリース (2017-07-08) の時点で、EcmaScriptletorconstキーワードを使用して真のブロック スコープをサポートするようになりました。


ECMAscript にはブロック スコープではなく関数スコープがあるため、関数コンテキストの先頭で変数を宣言することをお勧めします。

関数コンテキスト内の任意の時点で変数と関数の宣言を行うことができますが、結果を完全に認識していないと、非常に混乱し、奇妙な頭痛の種になります。

頭痛の例:

var foo = 10;

function myfunc() {
    if (foo > 0) {
        var foo = 0;
        alert('foo was greater than 0');
    } else {
        alert('wut?');
    }
}

何だと思いますか?ここに電話すると警告しmyfuncます。これは、ECMAscript インタープリターがステートメントと関数の宣言をコンテキストの先頭に自動的に持ち上げるためです。基本的に、最初の の前に初期化されます。varfooundefinedif statement

さらに読む: JavaScript のスコープと巻き上げ

于 2012-07-17T23:07:23.263 に答える
2

ifステートメント内にvarを配置することは、言語の「ルール」に違反しませんが、varの巻き上げにより、ifステートメントの条件が満たされているかどうかに関係なく、そのvarが定義されることを意味します。

于 2012-07-17T23:09:34.773 に答える
1

JavaScriptの変数には関数レベルのスコープがあるため、最初の例では変数を効果的に再宣言します。これにより、変数が強調表示される理由が説明される場合があります。

古いバージョンのFirefoxでは、厳密なJavaScriptモードでこの再宣言について警告していましたが、開発者の1人が、スタイルが窮屈であるため警告がオフになっていると不満を漏らしていました。(Firefoxの現在のバージョンは、ブロックレベルの変数宣言構文をサポートしています。)

于 2012-07-17T23:11:49.400 に答える
1

JavaScript の変数のスコープとは? の関数fourを参照してください。

2012 年現在、JavaScript にはブロック レベルのスコープはありません。ifしたがって、最初のバージョンは問題ありません。変数はブロック外のスコープで定義されています。

于 2012-07-17T23:07:44.690 に答える