JavaScript高級程序設計(第3版)第七章讀書筆記

第七章 函數表達式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. 有權訪問私有變量和私有函數的公有方法稱爲特權方法。第一種是在構造函數中定義特權方法。特權方法做爲閉包有權訪問在構造函數中定義的全部變量和函數。

    靜態私有變量,經過在私有做用域中定義私有變量或函數,建立特權方法。這個模式在定義構造函數時並無使用函數聲明,而是使用了函數表達式。

相關文章
相關標籤/搜索