2012-07-13 94 views
2

恰好碰到了這是正確的我的Javascript宇宙邊緣的具有約束力的問題,所以我要談我的方式,通過它,紅塔建議,並在我的問題到達:Javascript-bind()在ECMAScript 5之前/如何使用apply()或call()模擬?

function foo() { 
    document.body.addEventListener("click", this.bar); 
} 

foo.prototype.bar = function(evt) { 
    alert(this); 
} 

test = new foo(); 

此提醒有document.body元素,因爲this由於函數引用而丟失。因此,必須參考使用bind()堅持參考:

function foo() { 
    document.body.addEventListener("click", this.bar.bind(this)); 
} 

此提醒與foo類型的預期目的。


但是,根據this table,瀏覽器的一堆不會,如果我使用bind()發揮好。我一直在閱讀apply()call(),但它們似乎適用於有爭議的案例。在這種情況下,如何使用ECMAScript5之前的方法來實現我需要的bind()行爲?

+2

http://ejohn.org/apps/learn/(點擊「我們的目標」然後點擊下一步,你會在那裏看到答案。)另請參閱https://developer.mozilla.org/en/JavaScript/參考/ Global_Objects /功能/綁定。 – 2012-07-13 03:39:55

+0

酷豆人 - 非常有幫助。很高興接受爲解決方案。 – Ben 2012-07-13 03:54:02

回答

2

而不是給我自己的答案,約翰Resig tells you how here。 (點擊1)我們的目標然後點擊Next)。

Resig的解決方案來自prototype.js。您還可以看到MDN的描述here以及實現代碼,這與實際的ES5實現接近。不過,對於大多數目的而言,它應該足夠好。

相關問題