[英]this and passing function as parameter in Javascript
我有以下Javascript對象:
function Alfa() {
this.status='';
this.setStatus = function(value) {
this.status=value
}
}
function Beta() {
this.setSomething = function(setter) {
setter('Something');
}
}
而不是執行:
alf=new Alfa();
alf.setStatus('foo');
這很好,如果你查看alf的值, 狀態設置為'foo',但是:
bet=new Beta();
bet.setSomething(a.setStatus);
我所期望的是, bet將執行alf的 setStatus函數並將狀態值設置為'something',但是,這不會發生。 執行alf的 setStatus ,但是這不是指向alf實例而是指向Window ,因此為不為alf設置Window的屬性狀態。
獲得所需功能的正確方法是什么?
這當然是簡化的實現,在現實生活中我想將alf的那些函數傳遞給事件處理程序,所以我不能改變Beta實現,例如:
$('xxx').click(alf.setStatus)
JavaScript函數未綁定。 這意味着this
取決於它是如何調用的,而不是它是如何定義的。 因為你是在bet
內調用方法,所以this
是bet
為了解決這個問題,你需要做一個綁定的功能 ,它創建了一個穩定的this
無論功能如何調用。
如果您使用的是兼容ES5的JavaScript解釋器,則可以使用: Function.bind
alf.setStatus.bind(alf)
或者,如果你不是有幾個es5墊片,在舊的解釋器中提供此功能。 事實上,在mdn引用上提供了一個bind。 JQuery有一個名為$.proxy
的版本
一個簡單的實現是你需要一個帶有函數和范圍的函數。 然后專門在該范圍內調用您的方法,而不是使用它。 就像是。
function bind(func,o) { return function() { func.call(o); } }
JavaScript中的函數沒有附加到它們的上下文,例如Python中的綁定方法。 所以你可以做的是用上下文調用setStatus函數,如下所示:
bet.setSomething(function(value) {
a.setStatus.call(a, value);
});
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
改變setter('Something');
to setter.call(this, 'Something');
會工作。
function Alfa() {
this.status='';
this.setStatus = function(value) {
this.status=value
}
}
function Beta() {
this.status='';
this.setSomething = function(setter) {
setter.call(this,'Something');
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.