在Javascript編程中,函數表達式是一種非常有用的技術。
使用函數表達式可以無須對函數命名,從而實現動態編程。
一、匿名函數,也稱為拉姆達函數,是一種使用Javascript函數的強大方式
匿名函數的特點:
1、函數表達式不同於函數聲明。函數聲明要求有名字,但函數表達式不需要。沒有名字的函數表達式也叫做匿名函數。
2、在無法確定如何引用函數的情況下,遞歸函數就會變得比較復雜;
3、遞歸函數應該始終使用argument.callee來遞歸調用自身,不要使用函數名——函數名可能會發生改變。
二、閉包概念及原理
閉包的概念:當在函數內部定義了其它函數時,就創建了閉包。閉包有權訪問包含函數內部的所有變量
1、在後台執行環境中,閉包的作用域包含著它自己的作用域、包含函數的作用域和全局作用域(這個的原理可以參考執行鏈)
2、函數的作用域及其所有變量都會在函數執行結束後銷毀
3、當函數返回一個閉包時,這個函數的作用域將會一直在內存中保存到閉包不存在為止
三、閉包的作用
1、使用閉包可以在JavaScript中模仿塊級作用域(注:JavaScript本身並沒有塊級作用域的概念)
2、創建並立即調用一個函數,這樣既可以執行其中的代碼,又不會在內存中國留下對該函數的引用。
3、結果就是函數內部的所有變量都會被立即銷毀——除非將某些變量賦值給包含作用域(即外作用域)中的變量
四、閉包還可以用於在對象中創建私有變量
1、即使JavaScript中沒有私有對象屬性的概念,但可以使用閉包來實現公有方法,而通過公有方法可以訪問在包含作用域中定義的變量。
2、有權訪問私有變量的公有方法叫特權方法
3、可以使用構造函數模式、原型模式來實現自定義類型的特權方法,也可以使用模塊模式、增強的模塊模式來實現單例的特權方法
五、JavaScript中的函數表達式和閉包是極其有用的特性,利用它們可以實現很多功能。不過,因為創建閉包必須維護額外的作用域,所以過度使用它們可能會占用大量內存。