簡介:本文先從函式的宣告方式說起,介紹不同函式的宣告方式在函式宣告提公升上的不同。然後根據具體的例子比較變數宣告提公升和函式宣告提公升的不同。
第一部分:函式的宣告方式
函式宣告有三種方式:函式宣告,函式表示式(又稱函式字面量宣告),函式物件的宣告(使用率很低)
方式一:函式宣告
function 函式名(形參列表)
方式二:函式表示式(又稱函式字面量宣告)
var 變數名=function 函式名(形參列表)
方式三:函式物件的宣告
var 方法名 =new function("形參1","形參2","形參3", "方法體");
只有函式宣告才會函式宣告提公升,其他兩種不會函式宣告提公升。
上面的**才是真正的js執行順序。這裡面的test1和test2提公升是作為變數提公升的。
第二部分:函式宣告提公升和變數宣告提公升
上面是**的真正執行順序。不論變數的宣告在變數的同名函式之前還是之後,變數的同名函式的提公升都在變數的提公升之前。那麼不同名的情況下,變數的提公升和函式的提公升會是怎麼樣的。根據官網的說法上,函式的提公升都會在變數提公升之前(我沒想到驗證函式和變數不同名時候怎麼驗證提公升的先後順序)。
其實,我覺得搞懂這些一點用都沒有。這裡說一下我對變數提公升問題的理解,首先js是弱型別指令碼語言,那麼如果我們把function test0看做乙個確定了型別的變數,這個變數型別是function,變數名為test0。這樣乙個確定了型別的變數,就應該先被js寫入記憶體中,對於那些var 宣告的變數,test0的作用和型別更明確。只有變數覆蓋函式,函式不可能覆蓋變數,因為函式的宣告提公升永遠在最上面。
鳴謝:
深入理解js的變數提公升和函式提公升
一 變數提公升 在es6中提出了塊級作用域,用var宣告的變數,起作用域應為對整個塊都起作用,所以會跑偏 而且使用var宣告的變數會出現 變數提公升 現象。那麼什麼是變數提公升呢?用以下 直觀感受一下 其執行順序應為 二 函式提公升 js中建立函式有兩種方式 函式宣告式和函式字面量式。只有函式宣告才...
Js函式深入理解 函式宣告
js函式深入理解 函式宣告 本質 函式是function型別的乙個例項,即函式是乙個物件,函式名是指向物件的指標 1.如何定義乙個函式?三種方式 a.函式宣告 function a function是關鍵字,a是函式名 b.匿名函式 var a function 這個匿名函式可以看做乙個物件,然後把...
js中函式宣告提公升理解
js函式的定義兩種方式 函式宣告和函式表示式 test function test 這是因為js在 執行之前會先載入函式宣告 test var test function 以上 則會報錯,提示未宣告先呼叫 理解函式宣告提公升的關鍵就是理解函式宣告和函式表示式之間的區別 if condition el...