這篇文章主要介紹了關於js的函數宣告和函數表達式的分析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
在javascript中我們定義函數有以下兩種方式:
函數宣告
function say(){ console.log('函数声明'); }
函數表達式
var say = function(){ console.log('函数表达式'); }
在平時開發中,它們有著難以察覺的差別,我們看下下面的例子:
say(); var say = function(){ console.log('函数表达式'); } say(); function say(){ console.log('函数声明'); } say();
可以先在腦海中想一下答案,執行結果是:
函数声明 函数表达式 函数表达式
來,我們分析這個結果:
1.第一次呼叫say函數時,函數還未被定義,那為什麼可以印出「函數宣告」這個值呢?原因在於
javascript解釋器中存在一種變數宣告被提升的機制,也就是說函數宣告會被提升到作用域的最前面,即使寫程式碼的時候是寫在最後面,也會被提升至最前面。
而用函數表達式創建的函數是在運行時進行賦值,並且要等到表達式賦值完成後才能調用
因此,即使函數還未被定義,但是函數聲明已經被提升到最前面了,上面那段程式碼相當於:
var say; //变量被提升,此时的值为undefined say();// 函数被提升,输出“函数声明” var say = function(){ console.log('函数表达式'); } say(); function say(){ console.log('函数声明'); } say();
從下面兩個的對比,更能理解「函數宣告提升」這個概念:
1.
var say; console.log(say); say(); function say(){ console.log('函数声明'); } 输出: f say(){ console.log('函数声明'); } 函数声明
2.
var say; console.log(say); say(); var say = function(){ console.log('函数表达式'); } 输出: undefined Uncaught TypeError: say is not a function at <anonymous>:3:1
2.第二次呼叫say函數時,我們可以先簡單理解為此時的函數表達式
覆蓋了函數宣告
,因此輸出了'函數表達式',然而到了第三次呼叫say函數時,此時印出來的竟然還是'函數表達式'? ?為什麼後面的函數宣告
沒有覆寫前面的函數表達式
呢?其實在運行時由於函數宣告提升的原因,實際上運行的順序是類似於這樣的:
function say() { console.log('函数声明'); }//因为函数声明提升,所以在最前面运行了 say(); var say = function() { console.log('函数表达式'); } say(); say();
#1.函數宣告`在JS解析時進行函數提升,因此在同一個作用域內,不管函數宣告在哪裡定義,函數都可以進行呼叫。
2.函數表達式的值是在JS運行時確定,並且在表達式賦值完成後,該函數才能調用
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
以上是js的函數宣告和函數表達式的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!