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