一、遞歸
二、閉包
三、模仿塊級做用域
四、私有變量
五、小結
在JavaScript編程中,使用函數表達式能夠無需對函數命名,從而實現動態編程。匿名函數也稱爲拉姆達函數。
一、函數表達式的特色:編程
- (1)函數表達式不一樣於函數聲明。函數聲明要求有名字,但函數表達式不須要。沒有名字的函數表達式也叫作匿名函數;
- (2)在沒法肯定如何引用函數的狀況下,遞歸函數就會變得比較複雜;
- (3)遞歸函數應該是中應用arguements.callee來遞歸地調用自身,不要使用函數名,由於函數名可能會發生變化;
二、當在函數內部定義了其餘函數時,就建立了閉包。閉包有權訪問包含函數內部的全部變量,原理以下:閉包
- (1)在後臺執行環境中,閉包的做用域鏈包含着它本身的做用域、包含函數的做用域和全局做用域;
- (2)一般,函數的做用域及其全部變量都會在函數執行結束後被銷燬;
- (3)可是,當函數返回一個閉包時,這個函數的做用域將會一直在內存中保存到閉包不存在爲止;
三、使用閉包能夠在JavaScript中模仿塊級做用域(JavaScript自己沒有塊級做用域的概念)函數
- (1)建立並當即調用一個函數,這樣既能夠執行其中的代碼,又不會再內存中留下對該函數的引用;
- (2)結果就是函數內部的全部變量都會被當即銷燬——除非將某些變量賦值給了包含做用域(即外部做用域)中的變量;
四、閉包還能夠用於在對象中建立私有變量,相關概念和要點以下:對象
- (1)即便JavaScript中沒有正式的死有對象屬性的概念,但可使用閉包來實現公有方法,而經過公有方法能夠訪問在包含做用域中定義的變量;
- (2)有權訪問私有變量的公有方法叫作特權方法;
- (3)可使用構造函數模式、原型模式來實現自定義類型的特權方法,也可使用模塊模式、加強的模塊模式來實現單例的特權方法。
JavaScript中的函數表達式和閉包都是極其有用的特性,利用它們能夠實現不少功能。不過由於建立閉包必須維護額外的做用域,因此過分使用它們可能會佔用大量內存。遞歸