javascript閉包詳解

閉包與函數有着緊密的關係,它是函數的代碼在運行過程中的一個動態環境,是一個運行期的、動態的概念;是指詞法標識包括不必計算的變量的函數,也就是說該函數能夠使用函數外定義的變量。簡單來說,閉包就是一個函數可以訪問另外一個函數作用域中的變量,其擁有封閉性,類似於private起到一個保護變量的作用。

示例代碼:

var name = "xiao A";
var obj = {
    name : "xiao B" ,
    getName: function(){
    return function(){
        return this.name;
    }
}
};
//alert(obj.getName()());  //xiao A 
//var k = obj.getName();  //全局作用域
//alert(typeof k); // function類型
//alert(k());   //this也就是當前window
var name = "xiao A";
var obj = {
    name : "xiao B" ,
    getName: function(){
    // this總是指向調用者  也就是obj
    var o = this;

    return function(){
        return o.name;
    }
}
};
//alert(obj.getName()());   //xiao B
//var k = obj.getName();
//alert(k());
//1
function f(x){      // 2 
    var temp = x ;      //局部變量   //temp已經沒有被使用  
    return function(x){     // 3 (function 有了一個執行域 var obj)
        temp += x ;     //  又被使用了                       
        alert(temp);                        
    }
}               
var a = f(50);
//alert(a);   //function

//a(5);   //55
//a(10);    //65
//a(20);    //85    

當執行完f(50)之後由函數的執行環境因素,temp會被標記已經沒有被使用,但是在下一級的函數中又用到temp變量,因此再次標記使用了不會被垃圾回收,多次調用a()函數temp會一直存在內存中,知道沒有被調用纔會執行垃圾回收。

發佈了85 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章