86

JavaScriptの「巻き上げ」に出くわしましたが、このコードスニペットが実際にどのように機能するのかわかりませんでした。

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}

b();
alert(a);

function a() {}( )のような関数宣言が関数bスコープの一番上に引き上げられることは知っていますが、 a(関数宣言は変数宣言をオーバーライドしますが、変数の初期化はオーバーライドしないため)の値をオーバーライドするべきではないため、アラートの値は1ではなく10になります!!

4

5 に答える 5

115
  1. グローバルaはに設定されています1
  2. b()と呼ばれる
  3. function a() {}巻き上げられ、グローバルをマスクするローカル変数を作成しますaa
  4. ローカルa10(関数を上書きするa)に設定されています
  5. グローバルa(まだ1) は警告されます
于 2013-03-09T13:26:06.253 に答える
6

これは、この例のコンパイル/解釈の順序がやや誤解を招くためです。このfunction a () {}行は、関数の残りの部分が実行される前に解釈されるため、関数の最初で のa値がfunction a () {}. に再割り当てすると、 function のローカル スコープで10の値が再割り当てされます。これは、戻ると破棄され、グローバル スコープに の元の値が残ります。ab()a = 1

alert()適切な場所に s などを配置しaて、さまざまなポイントでの値を確認することで、これを確認できます。

于 2013-03-09T13:35:05.220 に答える
5

(1)JavaScriptにはブロックステートメントスコープがありません。むしろ、ブロックが存在するコードに対してローカルになります。

(2)関数スコープ内のJavascriptによる変数の宣言。つまり、関数で宣言された変数は、値が割り当てられる前であっても、その関数内のどこでも使用できます

(3)関数の本体内では、ローカル変数が同じ名前のグローバル変数よりも優先されます。グローバル変数と同じ名前のローカル変数または関数パラメーターを宣言すると、グローバル変数を効果的に非表示にできます。

あなたのコードは次と同じです:(コメントを読む

<script>
var a = 1;          //global a = 1
function b() {
    a = 10;         
    var a = 20;     //local a = 20
}
b();
alert(a);           //global a  = 1
</script>

参照:
(1)JavaScript変数スコープ:
(2) Javascriptホイストの危険な例
(3)変数スコープ

だからあなたのコードでは:

var a = 1;          //global a = 1  
function b() {
    a = 10;         
    return;
    function a() {} //local 
}
b();
alert(a);           //global a = 1  
于 2013-03-09T16:40:11.690 に答える
2
  1. 関数宣言function a(){}が最初に巻き上げられるため、ローカルスコープaで作成されます。
  2. 同じ名前の変数が 2 つある場合 (1 つはグローバルに、もう 1 つはローカルに)、ローカル変数は常にグローバル変数よりも優先されます。
  3. a=10設定すると、グローバル変数ではなくローカル変数が設定されますa

したがって、グローバル変数の値は同じままで、アラート 1 が表示されます

于 2014-05-17T13:30:17.750 に答える
0

あなたが行ったJavaScript Scoping and Hoisting と同じ記事を読んだとき、私も混乱しました。なぜなら、著者は 2 つの開始例コードがコンパイラーでどのように解釈されるかを示していなかったからです。

あなたが提供した例と、ページの2番目の例を次に示します。

var a = 1;
function b() {
    function a() {} // declares 'a' as a function, which is always local
    a = 10;
    return;
}
b();
alert(a);

ページの最初の例は次のとおりです。

var foo = 1;
function bar() {
    var foo; // a new local 'foo' variable
    if (!foo) {
        foo = 10;
    }
    alert(foo);
}
bar();

お役に立てれば

于 2013-11-06T05:30:28.460 に答える