第七章 函數表達式javascript
1. 函數聲明有一個重要特徵 ,函數聲明提高。即在執行代碼以前會先讀取函數聲明,意味着能夠把函數聲明放在調用它的語句後面。java
2. 使用arguments.callee實現對函數的遞歸調用。但在嚴格模式下,不能經過腳本訪問arguments.callee,但可使用命名函數表達式來達成相同的效果。閉包
3. 閉包是指有權訪問另外一個函數做用域中的變量的函數。建立閉包的經常使用方式,就是在一個函數內部建立另外一個函數。函數
4. 因爲閉包會攜帶包含它的函數的做用域,所以會比其餘函數佔更多的內存。慎重使用。this
5. 閉包只能取得包含函數中任何變量的最後一個值。閉包所保存的是整個變量對象。spa
6. 在閉包中使用this對象也可能致使一些問題,匿名函數的執行環境具備全局性,所以其this對象一般指向window。code
var name = "The window"; var object = { name: "My Object", getNameFunc :function(){ return this.name; } }; console.log(object.getNameFunc()); // My Object var name = "The window"; var object = { name: "My Object", getNameFunc :function(){ return function(){ return this.name; }; } }; console.log(object.getNameFunc()()); //The window
把外部做用域中的this對象保存在一個閉包可以訪問到的變量裏,就可讓閉包訪問該對象了。對象
1 var name = "The window"; 2 3 var object = { 4 5 name: "My Object", 6 7 getNameFunc :function(){ 8 9 var that=this; 10 11 return function(){ 12 13 return that.name; 14 15 }; 16 17 } 18 19 }; 20 21 console.log(object.getNameFunc()()); // My Object
7. 閉包在IE9以前的版本中會致使一些特殊的問題,若是閉包的做用域鏈中個保存着一個HTML元素,那麼就意味着該元素將沒法被銷燬。blog
8.模仿塊級做用域的匿名函數的語法:遞歸
(function(){ //這裏是塊級做用域 })();
以上代碼定義並當即調用了一個匿名函數,將函數聲明包含在一對圓括號中個,表示它其實是一個函數表達式,而緊隨其後的另外一對圓括號會當即調用幹這個函數。爲建黨,能夠寫成這樣:
var someFunction = function(){ //這裏是塊級做用域 }; someFunction();
注意:函數表達式後面能夠接圓括號,可是函數聲明後面不可接圓括號,將函數聲明嘉善跟一對圓括號便可轉換成函數表達式。
9. 模仿塊級做用域的作法常常在全局做用域中被用在函數外部,從而限制向全局做用域中添加過多的變量和函數。這種作法能夠減小閉包占用的內存問題,由於沒有直線搞匿名函數的引用,只要函數執行完畢,就能夠當即銷燬其做用域鏈了。
10. 任何在函數中定義的變量,均可以認爲是私有變量,由於不能在函數的外部訪問這些變量。
11. 有權訪問私有變量和私有函數的公有方法稱爲特權方法。第一種是在構造函數中定義特權方法。特權方法做爲閉包有權訪問在構造函數中定義的全部變量和函數。
靜態私有變量,經過在私有做用域中定義私有變量或函數,建立特權方法。這個模式在定義構造函數時並無使用函數聲明,而是使用了函數表達式。