js的閉包和this

各種專業文獻上的"閉包"(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數內部變量的函數。

由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。

所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋樑。

閉包的用途

閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。

代碼片段一。

  var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()());


代碼片段二。

  var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()());

第一個 打印結果爲 The window
第二個 打印結果爲 My Object

第一個 this爲全局對象,所以alert處理的name爲The window
第二個 that 爲object對象,所以alert 處理的name爲My object
第二個好理解,因爲在調用前用that 保存了object 自己的this,所以that 就成爲是有變量,在閉包內可以調用。
第一個有點暈,因爲第一個的this指向自己,然後被window 給調用this 就成了window對象,它的name就是全局的name


return function() {
return this.name;
}
這裏的this代表調用方法時所在的的作用域:全局作用域window。

return function() {
return that.name;
}
object.getNameFunc()()此處實現了從外部調用局部變量的方法,that會順着作用域鏈向上級作用域查找,所以獲得是getnameFunc的定義的變量var that = this。


每個函數在被調用時,其活動對象都會自動取得兩個特殊變量:this和arguments。內部函數在搜索這個變量時,只會搜索到其活動對象爲止,因此永遠不可能直接訪問外部函數中的這兩個變量(這一點通過前面的圖可以看得更清楚)。意思就是說找到匿名函數中的this和arguments就不會再往下找了(這裏的往下指的是外層的包含函數,和最外層的window全局環境),而匿名函數的this對象通常指向window,所以輸出的是全局的那個字符串。不過,把外部作用域中的this對象保存在一個閉包能夠訪問到的變量裏,就可以讓閉包訪問該對象了

關於this:http://www.quirksmode.org/js/this.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章