簡體   English   中英

使用數組中的參數調用函數 - apply()而不使用上下文參數?

[英]Call function with parameters from array - apply() without the context parameter?

是否有一個調用的功能,但將上下文的任何方法this為“默認”值,它具有當調用通過執行函數fn()

這個方法應該接受一個數組並將單個元素作為參數傳遞給函數,就像apply()一樣:

emitter = new EventEmitter();
args = ['foo', 'bar'];

// This is the desired result:
emitter.emit('event', args[0], args[1], ...);

// I can do this using apply, but need to set the context right
emitter.emit.apply(emitter, 'event', args);

// How can I trim the context from this?
emitter.emit.???('event', args);

編輯:為了澄清這一點,我不關心這個值this將有調用的函數里面-它必須是“正常”的情況下這樣做時,它具有emitter.emit()而不是全局對象或其他任何東西。 否則,這有時會破壞事情。

如果您不關心上下文,則可以傳遞nullundefined 在函數內部, this 會再是指全局對象時,在非嚴格模式null分別undefined嚴格模式

函數的“默認”上下文很難定義

function f() { return this };
a = { b: f }
c = a.b;

console.log(f());   # window
console.log(a.b()); # a
console.log(c());   # window

其中哪一個是“正確”的背景?

在您的情況下,您可能會考慮實用功能

/* you might call it something else */
emitter.emit_all = function (event, args) {
    return this.emit.apply(this, [event].concat(args));
}

只需將第一個參數設置為全局對象(即瀏覽器中的window

在ES3瀏覽器中,您可以傳遞null ,它會自動更改為全局對象,但在ES5規范中已刪除該行為。


編輯聽起來你只需要一個新功能:

EventEmitter.prototype.emitArgs = function(event, args) {
    this.emit.apply(this, [event].concat(args));
}

在這一點上你可以打電話:

emitter.emitArgs('event', args);

編輯感謝@Esalija為[].concat

這由本機Function“arguments”變量解決。

var EventEmitter = window.EventEmitter = function(){
    //this.emit = this.emit.bind(this);//bind emit to "this"
    return this;
};
EventEmitter.prototype.isMe = function(obj){
    return obj === this;
};
EventEmitter.prototype.emit = function(eventName){
    var input = Array.prototype.slice.call(arguments, 1);
    console.log("this:%O, Emitting event:%s, with arguments:%O", this, eventName,input);
};

emitter = new EventEmitter();
emitter.emit('magicEvent', 'Zelda Con', 'Zork Meetup', 'etc');

要維護“this”上下文,你可以在構造函數中綁定emit方法,盡管這會創建每個實例“自己的”對象屬性,增加內存消耗,並且實際上對對象創建執行所有原型鏈查找(對於綁定方法),無論您是否需要他們與否。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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