巻き上げでは、変数は関数定義よりも優先されますか、それともその逆ですか? 以下のコードを参照してください。
function a()
{
var x = 10;
function x() {
return 20;
}
return x;
}
巻き上げでは、変数は関数定義よりも優先されますか、それともその逆ですか? 以下のコードを参照してください。
function a()
{
var x = 10;
function x() {
return 20;
}
return x;
}
どちらが優先されるかという問題ではありません (優先順位が発生することはありますが、それは主にセマンティクスの問題です)。
ここで重要なのは、変数宣言の代入部分が巻き上げられていないのに対し、関数定義全体が巻き上げられていることです。
注意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
。
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);
}
コードは次のようになります。
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