JavaScript之命名錶達式

近期一直在看湯姆大叔寫的博文,他所介紹的知識點與理論較爲清晰,命名函數表達式是我之前從沒有去進行深究過的原理,雖然已多次在項目中使用javascript,但基礎還是不都紮實,多看多思多想是一直必須堅持的。這篇文章作爲學習筆記,很多知識點都是湯姆大叔所總結的,湯姆大叔博客鏈接在文末。

函數聲明:function 函數名稱(參數:可選){函數體}
函數表達式:function 函數名稱(可選)(參數:可選){函數體}
如果不聲明函數名稱,肯定是表達式
如果function foo(){}是作爲賦值表達式的一部分的話,就是函數表達式;如果fuction foo(){}被包含在一個函數體內,或者位於程序的最頂部的話,那它就是一個函數聲明

function foo(){}//聲明,因爲是程序的一部分
var bar=function foo(){};//表達式,賦值表達式
new function bar(){};//表達式,new表達式
(function(){//表達式,()是一個分組操作符,它的內部只能包含表達式
    function bar(){}//聲明,函數體的一部分
})();

區別:
1.函數聲明會在任何表達式被解析和求值之前先被解析和求值。注意:函數聲明在條件語句內可以使用,但不同的環境可能有不同的執行結果,最好使用函數表達式。
2.函數聲明只能出現在程序或函數體內,不能出現在block內(if、while、for語句中)
3.函數語句不是在變量初始化期間聲明的,而是在運行時聲明的(與函數表達式一樣)。函數語句的標識符一旦聲明能在函數的整個作用域生效了。

// 此刻,foo還沒用聲明
  typeof foo; // "undefined"
  if (true) {
    // 進入這裏以後,foo就被聲明在整個作用域內了
    function foo(){ return 1; }
  }
  else {
    // 從來不會走到這裏,所以這裏的foo也不會被聲明
    function foo(){ return 2; }
  }
  typeof foo; // "function"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章