javascript中的閉包

閉包:一個可以使用另外一個函數作用域中變量的函數。創建閉包的一種常見方式是在一個函數中創建另一個函數。
下面具體講述閉包的相關知識。
要理解閉包,首先來理解一下JavaScript變量的作用域。
變量的作用域有兩種:全局變量和局部變量。
- 全局變量
函數能夠讀取全局變量,例如:

var scope="global";
   function t(){
       console.log(scope);
   }
   t();//global
  • 局部變量
    函數外部無法讀取內部的局部變量。
  function t(){
       var scope="local"
   }
   console.log(scope);//error

那麼,如何從外部獲取局部變量呢?
通過在函數內部定義另一個函數,來獲取局部變量的值。
例如下面代碼:

function t(){
        var scope = "local";
        function t1(){
            alert(scope);
        }
        return t1;
    }

    var result = t();
result();

上面代碼中函數t1就是閉包,閉包就是將函數內部和函數外部建立起一座橋樑,使得外部能訪問到函數內的局部變量。
下面看兩端代碼理解閉包:
代碼一:

var name = "The Window";  
    var object = {
    name : "My Object",
    getNameFunc : function(){
    return function(){
         return this.name;
    };
    }
    };
    alert(object.getNameFunc()());  // The Window

代碼二:

var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        var that = this;
        return function(){
            return that.name;
        };
    }
};
alert(object.getNameFunc()());  // My Object

這兩段代碼涉及到this的指向問題。
代碼一中,object.getNameFunc()返回的是一個函數,不是object的屬性,那麼this自然就指向全局上下文了。
代碼二中,將this的指向保留在that中,此時,that仍是指向My Object的,因此結果爲My Object。
總結:閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。由於閉包會攜帶包含它的函數的作用域,因此會比其他函數佔用更多的內存。過度使用閉包可能會導致內存佔用過多,我們建議讀者只在絕對必要時再考慮使用閉包。

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