JS中的變數宣告提公升與函式宣告提公升優先順序

2021-10-01 08:55:25 字數 978 閱讀 7860

今天在群裡看到了一道題,如下。問輸出什麼?

var c = 1;

function c(c)

c(3);

看到的第一眼,第一想法就是這題考察的是變數提公升,唔,應該是輸出undefined。結果不對,報錯了

為啥呢?原來在乙個作用域中,變數宣告是有順序的:函式形參宣告--->函式宣告---->變數宣告 。任何一種宣告,如果在前面出現,都不會再次宣告。所以當變數提公升時,也就只有乙個有效了。

所以在函式執行環境對應的變數物件中,首先是c:function,然後到第一行定義c=1,所以在變數物件中有變成了c:1,在然後到c(3)語句,此時c定義為了數字,所以報錯c is not a function。

同理改變一下上面的**,在看看它的輸出。

var c = 1;

function d(c)

d(3);

輸出是3,為什麼呢?因為在執行d(3)時,函式d的執行環境推入環境棧中,與之關聯的變數物件也生成,根據之前的規則,先宣告函式引數,所以c:3,後面的var變數宣告就無效了。

那什麼時候才會出現我剛開始答的輸出undefined呢?想下面這樣時,他輸出就是undefined的。

var c = 1;

function d()

d();

因為不存在函式引數宣告,也不存在函式宣告,所以執行變數宣告,於是a先被提公升到函式作用域頂端,其變數物件中的值為,所以輸出undefined。

不懂的地方還有很多,每次有收穫就值得記錄一下,不過說的也不一定對,希望能指正出來。

JS變數宣告和函式宣告提公升

很多時候,在直覺上,我們都會認為js 在執行時都是自上而下一行一行執行的,但是實際上,有一種情況會導致這個假設是錯誤的。a 2 var a console.log a 按照傳統眼光,console.log a 輸出的應該是undefined,因為var a在a 2之後。但是,輸出的是2。再看第二段 ...

變數宣告提公升 Vs 函式宣告提公升

先看以下 1 var in window a in window console.log in window 2 var in window a in window console.log in window if a in window 3 var a var in window a in win...

JS中的變數宣告提公升

js是一種指令碼語言,和一些高階語言不同,它沒有完整編譯的過程,一般是邊寫邊編譯,這也是我們覺得指令碼語言比其他語言載入快的原因,其實,js中有變數宣告提公升這一機制。當js在執行的時候會分為2個階段,預解析,執行,當js在執行的時候會將所有用var宣告的變數以及關鍵字定義的函式進行提公升 func...