4

巻き上げでは、変数は関数定義よりも優先されますか、それともその逆ですか? 以下のコードを参照してください。

function a()
{
    var x = 10;

    function x() {
        return 20;
    }

    return x;
}
4

2 に答える 2

3

どちらが優先されるかという問題ではありません (優先順位が発生することはありますが、それは主にセマンティクスの問題です)。

ここで重要なのは、変数宣言の代入部分が巻き上げられていないのに対し、関数定義全体が巻き上げられていることです

注意raina77owの回答に基づいて、私の最初の仮定の一部が間違っていたようです。関数は変数宣言の前に巻き上げられますが、最終的な効果は同じです。

巻き上げた後、関数は次のように動作します。

function a()
{
    var x = function x() {  // hoisted function declaration/definition
        return 20;
    };
    var x;                  // hoisted variable declaration
    x = 10;                 // unhoisted part of variable declaration
    return x;
}

x = 10すべての巻き上げが完了した後に行われるため、これが に残る値ですx


元の関数が次のようになっている場合、@ thefourtheye の要求に応答するには (これが求められていると思います)。

function a() {
    function x() {
        return 20;
    }
    var x = 10;
    return x;
}

次に、巻き上げた後、次のようになります (上記と同じ)。

function a() {
    var x = function x() {  // hoisted function declaration/definition
        return 20;
    }
    var x;                  // hoisted variable declaration (does nothing)
    x = 10;                 // unhoisted variable assignment
    return x;
}

最後の例として、これを試してください。

function a() {
    console.log(x);
    var x = 10;
    console.log(x);
    function x() { return 20; };
}

呼び出されると、次のように出力されます。

function x() { return 20; }
10

これは、巻き上げによって関数が次のように動作するためです。

function a() {
    var x = function x() { return 20; };
    var x;
    console.log(x);
    x = 10;
    console.log(x);
}
于 2014-12-25T06:21:44.230 に答える
1

コードは次のようになります。

function a() {
  var x;
  function x() { // this function is assigned to variable indicator "x"
    return 20;
  }
  x = 10; // this overrides the variable indicator "x"
  return x;
}

したがって、関数を呼び出すと、次のようになります。

a() // 10
于 2014-12-25T06:24:00.953 に答える