1. 程式人生 > >JavaScript高階程式設計(第3版)第七章讀書筆記

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

第七章 函式表示式

1. 函式宣告有一個重要特徵 ,函式宣告提升。即在執行程式碼之前會先讀取函式宣告,意味著可以把函式宣告放在呼叫它的語句後面。

2. 使用arguments.callee實現對函式的遞迴呼叫。但在嚴格模式下,不能通過指令碼訪問arguments.callee,但可以使用命名函式表示式來達成相同的效果。

3. 閉包是指有權訪問另一個函式作用域中的變數的函式。建立閉包的常用方式,就是在一個函式內部建立另一個函式。

4. 由於閉包會攜帶包含它的函式的作用域,因此會比其他函式佔更多的記憶體。慎重使用。

5. 閉包只能取得包含函式中任何變數的最後一個值。閉包所儲存的是整個變數物件。

6. 在閉包中使用this物件也可能導致一些問題,匿名函式的執行環境具有全域性性,因此其this物件通常指向window。

var name= "The window";
varobject = {
         name: "My Object",
         getNameFunc :function(){
                   return this.name;
         }
};
console.log(object.getNameFunc());    // My Object
 
var name= "The window";
varobject = {
         name: "My Object",
         getNameFunc :function(){
                   return function(){
                            return this.name;
                   };
         }
};
console.log(object.getNameFunc()());    //The window


把外部作用域中的this物件儲存在一個閉包能夠訪問到的變數裡,就可以讓閉包訪問該物件了。

var name= "The window";
varobject = {
         name: "My Object",
         getNameFunc :function(){
                   var that=this;
                   return function(){
                            return that.name;
                   };
         }
};
console.log(object.getNameFunc()());   // My Object


7. 閉包在IE9之前的版本中會導致一些特殊的問題,如果閉包的作用域鏈中個儲存著一個HTML元素,那麼就意味著該元素將無法被銷燬。

8.模仿塊級作用域的匿名函式的語法:

(function(){
       //這裡是塊級作用域
})();


以上程式碼定義並立即呼叫了一個匿名函式,將函式宣告包含在一對圓括號中個,表示它實際上是一個函式表示式,而緊隨其後的另一對圓括號會立即呼叫幹這個函式。為建黨,可以寫成這樣:

var someFunction = function(){
   //這裡是塊級作用域
};
someFunction();


注意:函式表示式後面可以接圓括號,但是函式聲明後面不可接圓括號,將函式宣告嘉善跟一對圓括號即可轉換成函式表示式。

9. 模仿塊級作用域的做法經常在全域性作用域中被用在函式外部,從而限制向全域性作用域中新增過多的變數和函式。這種做法可以減少閉包占用的記憶體問題,因為沒有直線搞匿名函式的引用,只要函式執行完畢,就可以立即銷燬其作用域鏈了。

10. 任何在函式中定義的變數,都可以認為是私有變數,因為不能在函式的外部訪問這些變數。

11. 有權訪問私有變數和私有函式的公有方法稱為特權方法。第一種是在建構函式中定義特權方法。特權方法作為閉包有權訪問在建構函式中定義的所有變數和函式。

    靜態私有變數,通過在私有作用域中定義私有變數或函式,建立特權方法。這個模式在定義建構函式時並沒有使用函式宣告,而是使用了函式表示式。