閉包與函數有着緊密的關係,它是函數的代碼在運行過程中的一個動態環境,是一個運行期的、動態的概念;是指詞法標識包括不必計算的變量的函數,也就是說該函數能夠使用函數外定義的變量。簡單來說,閉包就是一個函數可以訪問另外一個函數作用域中的變量,其擁有封閉性,類似於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會一直存在內存中,知道沒有被調用纔會執行垃圾回收。