25

次のコードがあります。関数を宣言し、その後に関数と同じ名前の変数を宣言します。

function a(x) {
    return x * 2;
}

var a;
alert(a);

これがアラートundefinedになると思っていましたが、実行すると、アラートに次のように表示されます。

関数 a(x) {
    x * 2 を返す
}

変数に値を代入すると ( のようにvar a = 4)、アラートにはその値 ( 4) が表示されますが、この変更aがなければ関数として認識されます。

なぜこうなった?

4

5 に答える 5

13

JavaScript では、関数宣言変数宣言の両方が、関数内で定義されている場合は関数の先頭に、関数の外にある場合はグローバル コンテキストの先頭に引き上げられます。また、関数の宣言は変数の宣言よりも優先されます (ただし、変数の代入よりは優先されません)。

関数宣言は、ホイスト時に変数宣言をオーバーライドします

まず、変数を宣言します。

var a; // value of a is undefined 

次に、a関数の宣言は変数の宣言よりも優先されるため (ただし、変数の代入よりは優先されない) 、 の値は関数です。

function a(x) {
  return x * 2;
}

を呼び出すと、それが得られますalert(a);

ただし、変数を宣言する代わりに変数var a = 4;の割り当てを行うと、割り当てられた値4が優先されます。

于 2016-11-18T11:25:18.143 に答える
4

asを使用するfunction namevariable name、その値は に置き換えられfunction bodyます。あなたのアラート表示機能になりvar aます。function aa

編集しかし、値をalikeに割り当てるとvar a = "xya";。その後、functionに置き換えられvariableます。優先順位による

  1. 変数の代入は関数宣言よりも優先されます
  2. 関数宣言は変数宣言よりも優先されます
于 2016-11-18T11:24:19.180 に答える
2

var aまた、それが巻き上げられていることも覚えておく必要があります。これにより、このようになります

var a; // placed

function a(x) {
  return x * 2;
};

var a; // removed
alert (a); // a is replaced by function body

var aそれが巻き上げられていることを覚えておいてください4 to a

var a; // placed

function a(x) {
  return x * 2;
};

var a = 4; // removed
a = 4 // added

alert (a); // a is now 4
于 2016-11-18T11:26:46.270 に答える