我正在读一篇文章。它与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”的值不变?
答案 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