提升時,變量優先於函數定義還是其他方式?請參閱下面的代碼:Javascript - 提升優先
function a()
{
var x = 10;
function x() {
return 20;
}
return x;
}
提升時,變量優先於函數定義還是其他方式?請參閱下面的代碼:Javascript - 提升優先
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);
}
請交換'var'和'function'並將其推理。 – thefourtheye
@thefourtheye編輯我的答案。那是你要求的嗎?我不確定我瞭解你的要求。 – JLRishe
'這不是變量在提升時優先 - 所以,函數定義是優先的,對吧? – thefourtheye
你的代碼就等於以下內容:
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
我不會寫代碼,你有變量x和函數x。 x已經被定義。它令人困惑的代碼並不需要。在代碼審查中,我會讓程序員改變。變量被提升到範圍的頂部,然後分配到他們被調用的地方。 –
在ECMAScript 5.1下,沒有關於提升的討論。所以你不應該依賴任何具體的實現。最佳做法是在範圍頂部聲明變量,然後在聲明後進行初始化。 –