为什么" o.value"的价值?当调用changer(o.inc)时没有改变?
小提琴:http://jsfiddle.net/illumine/qbr9xupt/
function customobject(){
this.value = 2;
}
customobject.prototype.inc = function(){
this.value++;
}
function changer(func){
func();
}
var o = new customobject();
alert(o.value); // o.value = 2
o.inc();
alert(o.value); // o.value = 3
changer(o.inc);
alert(o.value); // Still 3 why not 4
答案 0 :(得分:2)
o.inc
为您提供了一个函数的引用,该函数在被调用时不带有它来自this
的函数(JS中的一个巨大挑战)。要解决它,请执行以下操作:
changer(o.inc.bind(o));
函数上的bind
方法可以将其固定为this
(如果您愿意,还可以进行curry)。
答案 1 :(得分:2)
changer(o.inc);
您在此处传递了对inc
功能的引用。此引用与o
对象无关。当您调用该函数时,this
此上下文是全局范围(window
)。
您可以将o
this
绑定到您的函数,然后再将其传递给changer
:
changer(o.inc.bind(o));
但IE8及以下版本不支持Function.prototype.bind
方法。一个简单的替代解决方案是将函数包装成这样:
changer(function(){ return o.inc(); });
或者,您可以使用Function.prototype.call
将o
作为this
来调用该函数,并传递对该对象的引用。
function changer(_this, func){
func.call(_this);
}
...
changer(o, o.inc);
答案 2 :(得分:1)
了解this
行为的表现并非易事,而且非常重要。我建议您查看http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/
在调用类似常规函数的方法时,this
绑定到global
对象,因此o.inc
不会更改。你也可以试试这个:
var foo = o.inc;
foo();
console.log(o.value); // still 3