今天遇到一道很有意思的題目
console.log(c);var c;
function c(a)
}c(2);
小夥伴們的答案是什麼呢?
這就涉及到我們的函式和變數的預解析了
js『從上到下執行』,但是可不是執行到哪才執行那一句語句。。
舉個栗子:
(現在用let和const沒這個問題,會直接報錯)
console.log(a);
var a = 0;
輸出undefined,而不是直接報錯,為什麼?
因為瀏覽器會預解析變數,也就是:
var a;
conso.log(a);
a = 0;
瀏覽器的預解析不止變數,還有函式宣告
1)函式宣告會置頂
2)變數宣告也會置頂
3)函式宣告比變數宣告更置頂:(函式在變數上面)
4)變數和賦值語句一起書寫,在js引擎解析時,會將其拆成宣告和賦值2部分,宣告置頂,賦值保留在原來位置
5)宣告過的變數不會重複宣告
注意:函式變數在下面重新賦值的話會覆蓋掉函式宣告(只宣告就不會,栗子:var obj;)
function obj()var obj = 'test'
obj() // 報錯,obj is not a function
說了那麼多廢話,上面那個才是關鍵,函式宣告的等級高於變數宣告,所以上面那道題可以解釋為:
functionc(a)
vara;
console.log(a);
a = 3;
} varc;
console.log(c);
c(2);
好了,就這樣....
JS 函式名和變數名重名
繼續作用域的問題,今天上午看了一會,下午看又看到了乙個型別的題,函式名和變數名相同的問題。之前還不會覺得函式名和變數名重名了會有什麼衝突。也是沒有去測試過。懶了。直接貼 出乎意料的報錯了,有點一頭霧水的感覺。但是一步一步的去分析的話,還是可以明白為什麼會是這個答案。首先這道題需要和js的預編譯階段掛...
JS 函式名和變數名重名
繼續作用域的問題,今天上午看了一會,下午看又看到了乙個型別的題,函式名和變數名相同的問題。之前還不會覺得函式名和變數名重名了會有什麼衝突。也是沒有去測試過。懶了。直接貼 出乎意料的報錯了,有點一頭霧水的感覺。但是一步一步的去分析的話,還是可以明白為什麼會是這個答案。首先這道題需要和js的預編譯階段掛...
JS中變數名和函式名重名
var x 12 var x 13 function x console.log x 13 err x is not a function x 這個串 執行完會報錯 a is not a function 問題來了,為什麼會報這個錯誤呢?這裡涉及到函式和變數的預解析 1 函式宣告會置頂 2 變數宣告...