6 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
看我對你代碼的注釋吧.
function counter1(start){
var count = start;
var increase = function(){
// 這里訪問的count就是 上面聲明的那個, 這里的概念是 閉包
count++;
};
var getValue = function(){
// 這里訪問的count就是 上面聲明的那個, 這里的概念是 閉包
return count;
};
return {
inc : increase,
get :getValue }
}
var c1 = new counter1(5);
// 下面兩行調(diào)用的函數(shù)屬于閉包返回的, 本質(zhì)訪問的是counter1里聲明的那個count
c1.inc(); //is able to increase 1
console.log(c1.get());//can return 6
function counter2(start){
var count = start;
var increase = function(){
// 這里訪問的是this的count. 這里你需要理解this到底指向誰(與C++里的this不同)
this.count++;
};
var getValue = function(){
// 這里訪問的是this的count. 這里你需要理解this到底指向誰(與C++里的this不同)
return this.count;
};
return {
inc : increase ,
get :getValue }
}
var c2 = new counter2(5);
// 這里訪問inc時, this指針指向c2, 由于c2中沒有count屬性;
// 所以其實調(diào)用this.count++之前this.count的值是undefined;
// 對一個undefined的值做++操作返回NaN, 即this.count++之后this.count的值是NaN;
// 此時調(diào)用c2.get()返回NaN.
c2.inc(); //can NOT access this.count
console.log(c2.get());//return NaN

TA貢獻1859條經(jīng)驗 獲得超6個贊
this指向當(dāng)前作用域的調(diào)用者。大概就是這個意思。
試著分析你的c2:
function counter2(start){
var count = start;
var increase = function(){
this.count++;
};
var getValue = function(){
return this.count;
};
return {
inc : increase ,
get :getValue }
}
var c2 = new counter2(5);
/*
實例化c2:
傳入?yún)?shù)start=5;
定義并賦值內(nèi)部變量count=5
定義increase和getValue函數(shù)表達式
將一個匿名對象賦值給c2,對象包含inc和get兩個屬性,分別指向兩個函數(shù)。
*/
c2.inc(); //can NOT access this.count
/*
直接執(zhí)行對象c2下的inc函數(shù)。由于是直接執(zhí)行函數(shù),函數(shù)中的this將被指向函數(shù)的調(diào)用者:對象c2。
increase函數(shù)試圖查找this.count,即c2.count,并執(zhí)行++操作。
由于對象c2中不存在count屬性,對一個undefined對象進行++操作時生成NaN,即c2.count被賦值為NaN。
*/
console.log(c2.get());//return NaN
/*
直接執(zhí)行對象c2下的get函數(shù)。函數(shù)this指向c2,因此返回在c2.count。由于在increase中,c2.count被賦值為NaN,因此返回NaN。
*/

TA貢獻1773條經(jīng)驗 獲得超3個贊
counter1是通過生命周期超長的那個閉包拿到count的。
js里的this到底指向的是誰,是在函數(shù)被調(diào)用時決定,同一個函數(shù),可能會指向不同的對象。
添加回答
舉報