6 回答

TA貢獻1828條經驗 獲得超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);
// 下面兩行調用的函數屬于閉包返回的, 本質訪問的是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屬性;
// 所以其實調用this.count++之前this.count的值是undefined;
// 對一個undefined的值做++操作返回NaN, 即this.count++之后this.count的值是NaN;
// 此時調用c2.get()返回NaN.
c2.inc(); //can NOT access this.count
console.log(c2.get());//return NaN

TA貢獻1859條經驗 獲得超6個贊
this指向當前作用域的調用者。大概就是這個意思。
試著分析你的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:
傳入參數start=5;
定義并賦值內部變量count=5
定義increase和getValue函數表達式
將一個匿名對象賦值給c2,對象包含inc和get兩個屬性,分別指向兩個函數。
*/
c2.inc(); //can NOT access this.count
/*
直接執行對象c2下的inc函數。由于是直接執行函數,函數中的this將被指向函數的調用者:對象c2。
increase函數試圖查找this.count,即c2.count,并執行++操作。
由于對象c2中不存在count屬性,對一個undefined對象進行++操作時生成NaN,即c2.count被賦值為NaN。
*/
console.log(c2.get());//return NaN
/*
直接執行對象c2下的get函數。函數this指向c2,因此返回在c2.count。由于在increase中,c2.count被賦值為NaN,因此返回NaN。
*/

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