function fn() {
var a = 0;
function fn1() {
a ;
console.log(a)
}
return fn1;
}
fn();
fn();
fn();
解析:fn函數(shù)被調(diào)用了三次,每調(diào)用一次,就 創(chuàng)建一次新的執(zhí)行環(huán)境,執(zhí)行完成好進行銷毀,所以每次調(diào)用a就從0開始 ,所以輸出結(jié)果為1,1,1;閉包機制有三套 3.常見的閉包 a. 將函數(shù)作為另一個函數(shù)的返回值; b. 將函數(shù)作為實參傳遞給另一個函數(shù)調(diào)用; c. 使用閉包實現(xiàn)私有方法操作獨立的私有屬性;
看如下代碼
functionc fn(){
var num =10;
function fun(){
console.log(num);
}
return fun;
}
var f = fn();
console.log(f);
console.log(f());
將函數(shù)作為另一個函數(shù)的返回值; 解析
var f =fn();
fn();//fn 運行 返回值是fun函數(shù)
var f =function fun(){
console.log(num);
}
f = null; 解決方式;讓閉包機制清除,必須刪除外部函數(shù)調(diào)用的時候生成的(定義的那個對應(yīng)內(nèi)部函數(shù));
6.閉包面試題 代碼段1
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
console.log(object.getNameFunc()());
解析
//解析
var f = object.getNameFunc();
var f = function() {
return this.name;
}
f();
function() {
return this.name;
}(); //相當(dāng)于立即執(zhí)行函數(shù) this指向的是window
此題沒有用到閉包 所以輸出結(jié)果為 The Window; 代碼段2
var name2 = "The Window";
var object2 = {
name2: "My Object",
getNameFunc: function () {
var that = this;
return function () {
return that.name2;
};
}
};
console.log(object2.getNameFunc()());
解析 典型的一個作用域可以訪問另一個函數(shù)的局部變量。是閉包 var that =this; 這個this指的調(diào)用者object2對象,所以that也是object2對象,所以that.name2指的是object2的name屬性。輸出結(jié)果為 My Object;