變數名與函式名重複

2022-09-03 17:06:14 字數 1046 閱讀 6093

今天遇到一道很有意思的題目

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

說了那麼多廢話,上面那個才是關鍵,函式宣告的等級高於變數宣告,所以上面那道題可以解釋為:

function

c(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 變數宣告...