在javascript中调用另一个函数时值不变

时间:2015-09-30 12:54:08

标签: javascript

我正在读一篇文章。它与javascript有关。这是来自文章的代码示例。请看下面。

function customobject(){ 
this.value = 2; 
} 

customobject.prototype.inc = function(){ 
this.value++;
 } 

function changer(func){ 
func();
 } 

var o = new customobject();
 
alert(o.value);   
o.inc(); 
alert(o.value);  
changer(o.inc); 
alert(o.value); 

我的问题是为什么调用更换器(o.inc)时“o.value”的值不变?

2 个答案:

答案 0 :(得分:3)

o.inc只是对匿名函数的引用:

function() { 
    this.value++;
}

this是执行函数的范围。因此,当您运行changer(o.inc)时,this实际上指向全局,在浏览器中window。它不一定与o有任何关系。

您可以像这样绑定范围:

function changer(func, scope){ 
    func.call(scope); // or apply
} 

changer(o.inc, o); 

或者简单地说:

function changer(func){ 
    func();
}
changer(o.inc.bind(o));

答案 1 :(得分:0)

问题是因为Function不保存对象的实例。你必须将对象作为参数传递,所以调用你的函数,就像这样。



function customobject(){ 
    this.value = 2; 
} 

customobject.prototype.inc = function(){
    this.value++;
} 

function changer(o){ 
   o.inc();
} 

var o = new customobject();
 
console.log(o.value);  //It has to print 2 
o.inc();               //Increment to 3
console.log(o.value);  //It has to print 3
changer(o);            //Increment to 4
console.log(o.value);  //It has to print 4