shr*_*ing 4 javascript arguments
我用javascript编写了一个观察者.您可以触发这样的事件:
ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn)
Run Code Online (Sandbox Code Playgroud)
有一个可变数量的参数,第一个参数是事件名称.我也有订阅者,这些订阅者保存在我的事件类的私有属性中.他们被这样称呼:
Event.prototype.triggerEvent = function() {
var callbacks = this._events[eventName];
if(callbacks !== undefined) {
for (var i = 0, l = callbacks.length; i < l; i++) {
// I do not need the first argument here!!!
callbacks[i].apply(callbacks[i], arguments);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,订户确实知道事件名称,因此可以省略它.但我不知道,如何从列表中删除一个参数(因为它不是一个数组,但似乎是某种对象).
我还需要读取事件名称,一旦被删除,因为在没有直接订阅者之后,全局事件系统就会启动.这个全局事件系统需要名称.
因此整个函数看起来像这样:
Event.prototype.triggerEvent = function() {
// First we deliver to direct subscribers
var callbacks = this._events[eventName];
if(callbacks !== undefined) {
for (var i = 0, l = callbacks.length; i < l; i++) {
// I do NOT need the first argument here!!!
callbacks[i].apply(callbacks[i], arguments);
}
}
// Now we broadcast the event to the entire system
// I DO need the first argument here!!!
Facade.getInstance().broadcastEvent.apply(Facade.getInstance(), arguments);
}
Run Code Online (Sandbox Code Playgroud)
你会如何实现这个?
Moh*_*Ted 11
你可以像这样shift从Array()对象"借用" 方法:
缓存shift方法
shift = [].shift;
Run Code Online (Sandbox Code Playgroud)
然后用它来取下第一个元素arguments(因为它只是一个像对象一样的数组)
var firstArg = shift.apply(arguments); //in case you need it
.
.
.
callbacks[i].apply(callbacks[i], arguments);
Run Code Online (Sandbox Code Playgroud)
正如@casablanca所说,
许多方法适用于任何行为类似于数组(数字索引和长度属性)的方法
该shift方法仅是其中之一.