[英]Is it possible to call function.apply without changing the context?
[英]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()
而不是全局对象或其他任何东西。 否则,这有时会破坏事情。
如果您不关心上下文,则可以传递null
或undefined
。 在函数内部, 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.