3

私はSublimeText2にSublimelinterをインストールしていますが、それは素晴らしいことです。ただし、次のコードは好きではありません。

if(condition){
    var result = 1;
}else{
    var result = 2;
}
process(result);

var result = 2;その結果はすでに定義されており、process(result);そのために範囲外で使用されていると書かれています。{}ifステートメントをより閉じたスコープと間違えているだけですか、それとも実際に次のように実行する必要がありますか?

var result;
if(condition){
    result = 1;
}else{
    result = 2;
}
process(result);
4

7 に答える 7

6

いいえ、それは「間違っている」わけではありません。ECMAScript仕様に従って、最も近い関数定義の先頭に引き上げられます。

はい、プログラム「Sublimelinter」は、変数が範囲外であると主張するのは正しくありません。

于 2012-06-05T23:35:59.360 に答える
3

それは間違いではありません。そのエラーが発生した場合resultは、コードの前半で定義したものです。

結果を使用する必要がないように、条件をこれに単純化することもできます。

process( condition ? 1 : 2 );
于 2012-06-05T23:37:56.760 に答える
1

Javascriptには、他の多くの言語のように「ブロックスコープ」がありません。もしそうなら、それが定義されたブロックの外でそれを参照することができないのでresult、あなたが呼び出そうとしたときに変数は存在しなかったでしょう。process(result){}

ただし、javascriptには関数スコープしかなく、ある関数の変数に別の関数からアクセスすることはできません。関数内で変数が宣言されている場所は、その関数内のどこからでもアクセスできるため(ブロックスコープなし)、何の意味もありません。したがって、投稿した両方のコードスニペットは、コードを実行しているインタープリターと同等です。

2つ目は、変数が使用される場所(関数全体)を示しているため、より明確であるため、2番目の方が適しています。また、関数のスコープ内で変数が2回宣言されるのを防ぎます。これにより、必ずしも悪いことが起こるとは限りませんが、有益なことは絶対に起こりません。変数のスコープは宣言された場所に関係なく関数全体になるため、実際には問題ではありませんが、ほとんどの場合、変数を異なる下位レベルで2回ではなく、上位レベルで1回宣言する必要があります。

于 2012-06-05T23:44:19.410 に答える
0

JavaScriptにはブロックスコープがありません。変数は、それらが定義されている関数にスコープされます。つまり、ifブロック内で変数を宣言すると、変数は関数の先頭に「持ち上げられ」ます。

とにかく変数は関数の先頭で技術的に定義されているため、コードの意図が明確になるように、変数宣言を関数の先頭に移動することがベストプラクティスと見なされます。

あなたのコードは「間違っている」わけではないと思いますが、JavaScriptでスコープがどのように機能するかをよく知らないコードを読んでいる人にとっては誤解を招く恐れがあります。コードの実行方法を実際に反映しているため、私は間違いなく2番目のバージョンを選択します。

これは可変巻き上げを説明する良い記事です。

于 2012-06-05T23:38:01.520 に答える
0

にifステートメントがある関数で-を使用してvarポインターを1回宣言します。ninjageckoが述べたように、すべての変数はそれらを含む関数の先頭に送られます。

でも; 同じvarを2回宣言すると、varがリセットされるので注意してください。

于 2012-06-05T23:38:26.310 に答える
0

私はこれを行うことをお勧めします:

var result = MORE_LIKELY_OUTCOME;

if (LESS_LIKELY_CONDITION) {
    result = LESS_LIKELY_OUTCOME;
}

process(result);

このようにして、最初は、ほとんどの場合に期待する結果に結果を設定します。その後、if条件が発生すると、ステートメントは結果を変更します。

于 2012-06-05T23:39:02.917 に答える
0

SublimeLinterがJSHintを使用していることがわかりました。これには、この警告を抑制し、その存在理由を説明するオプションがあります。


funcscopeこのオプションは、後で外部から変数にアクセスするときに、制御構造の内部で変数を宣言することに関する警告を抑制します。JavaScriptにはグローバルと関数の2つの実際のスコープしかありませんが、そのような慣習は、言語に不慣れな人々の間で混乱を招き、デバッグが難しいバグにつながります。これは、デフォルトでは、JSHintが意図したスコープ外で使用されている変数について警告する方法です。

于 2012-06-07T00:31:56.787 に答える