簡體   English   中英

這個和傳遞函數作為Javascript中的參數

[英]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內調用方法,所以thisbet

為了解決這個問題,你需要做一個綁定的功能 ,它創建了一個穩定的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM