Javascript Gotcha:为什么价值不增加?

时间:2015-02-24 17:39:28

标签: javascript

为什么" 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

3 个答案:

答案 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.callo作为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