大家好,
如下面的代码所示,counter1可以运行,counter2却不行,两者的区别是我在counter2里用了this来访问count变量。
function counter1(start){
var count = start;
var increase = function(){
count++;
};
var getValue = function(){
return count;
};
return {
inc : increase,
get :getValue }
}
var c1 = new counter1(5);
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++;
};
var getValue = function(){
return this.count;
};
return {
inc : increase ,
get :getValue }
}
var c2 = new counter2(5);
c2.inc(); //can NOT access this.count
console.log(c2.get());//return NaN
我用debug工具查看counter2里面的this。发现this不包含count变量。我知道在可counter2 里面可以通过 return { count: count, inc : increase , get :getValue })这样this就能访问count了。
但是我就搞不懂,为什么counter1里面没有用this,count反而是可以访问的(即使在counter1也没有return count这个变量),而counter2却不行呢?
多谢大家。

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
看我对你代码的注释吧.
this指向当前作用域的调用者。大概就是这个意思。试着分析你的c2:
counter1是通过生命周期超长的那个闭包拿到count的。
js里的this到底指向的是谁,是在函数被调用时决定,同一个函数,可能会指向不同的对象。
因为那里的this指向你返回的
{inc: increase , get: getValue}对象了。楼上很多热心朋友都说了这个答案。解决办法很多,除了用that之外,也可以考虑用call、apply或者bind等方法来重置作用域。javascript中的this指向问题