2014-01-16 93 views
2

下面是我的問題的一個非常簡化的版本。如果不更改對象「o」的定義而不使用名稱「obj」,我如何才能在foo內引用obj。Javascript回調,引用自己的對象

var obj = { 
    foo: function() { 
     alert(this.greet); // => undefined, obj.greet works but not feasible for my case 
    }, 
    greet: "hi" 
}; 

var o = { 
    m: obj.foo 
}; 

o.m(); 

回答

6

創建一個新函數,該函數使用正確的上下文調用舊函數。 The bind method將在充足的現代瀏覽器中爲您做到這一點。

var o = { 
    m: obj.foo.bind(obj) 
}; 

如果你想支持傳統的瀏覽器:

var o = { 
    m: (function (context) { 
     return function() { 
      context.foo(); 
     }; 
    }(obj)) 
}; 
+0

哇!解決了!!!謝啦! – user3124390

+0

對於舊版瀏覽器,您鏈接的MDN頁面上有一個完整的'.bind()'填充。 – kapa

0

如果你不想或不能改變的對象o的定義,可以做到以下幾點:

代替

o.m(); 

o.m.call(obj);