2015-02-24 86 views
1

爲什麼在調用變換器(o.inc)時「o.value」的值不變?Javascript Gotcha:爲什麼價值不增加?

小提琴: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 
+1

因爲'this'不是你認爲的那樣。在'this.value ++'之前嘗試'alert(this)',你會看到。 – 2015-02-24 17:42:36

+0

這個頁面解釋你正在經歷的事情,也有一個類似於你的代碼的例子。 http://snook.ca/archives/javascript/javascript_pass – Nelson 2015-02-24 17:46:55

回答

2
changer(o.inc); 

你傳遞一個參考inc功能在這裏。此參考與o對象無關。當你調用函數時,this是這個上下文是全局範圍(window)。

你可以將它傳遞給changer像在此之前綁定othis給你的函數:

changer(o.inc.bind(o)); 

Function.prototype.bind方法不支持IE8及以下。一個簡單的替代解決方案將是包裝功能是這樣的:

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

或者,你可以使用Function.prototype.callo調用函數作爲this並傳遞給對象的引用。

function changer(_this, func){ 
    func.call(_this); 
} 
... 
changer(o, o.inc); 
2

o.inc給你,調用它時,不會與它從(在JS的巨大挑戰之一)附帶的this攜帶一個函數的引用。要解決它,這樣做:

changer(o.inc.bind(o)); 

上的功能的bind方法可以在水泥的this(以及不討好,如果你想)。