var a = 1;
function a()
{
console.log(a);
};
a();
這幾行JS程式碼運行會報錯,但原因是什麼?求大神講解
过去多啦不再A梦2017-05-19 10:31:08
函數做為javascript的第一個公民,所以在此處存在函數提升。上述程式碼最後的實現和以下效果是一樣的
function a()
{
console.log(a);
};
var a = 1;
a();
這樣會導致原有的函數名被覆蓋。
高洛峰2017-05-19 10:31:08
先說一點 js 看到 var a = 1 是 分兩步驟來解析,第一 把var a 提升到目前作用域頂端,然後依序往下解析,知道a = 1 開始賦值
這就是 變數 跟 函數重名的問題,簡單來說 js引擎解析順序是這樣的
1.變數個函數宣告提升到目前作用域頂端 → var a ↑ 和 `function a()
{
console.log(a);
}`
2.然後解析剩下的程式碼 `a=1;
a()`,
怪我咯2017-05-19 10:31:08
這是因為函數宣告會提前
var a = 1;
function a()
{
console.log(a);
};
a();
1)函數宣告會置頂
2)變數宣告也會置頂
3)函數宣告比變數宣告更置頂:(函數在變數上方)
4)變數和賦值語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置
5)聲明過的變數不會重複聲明
就會相當於下面的這個樣子
var a = function ()
{
console.log(a);
};
var a = 1;
a();
希望幫你~
漂亮男人2017-05-19 10:31:08
很多人都提到了是變數提升的問題,但解釋的不太對。 var
提升是拆開來提升的,函數是整個提升的。 fYI
所以應該是這個樣子:
var a;
function a ()
{
console.log(a);
};
a = 1;
a();