今天在群裡看到了一道題,如下。問輸出什麼?
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...