在javascript中删除并向函数参数列表添加元素

在javascript中删除并向函数参数列表添加元素,javascript,arguments,Javascript,Arguments,我已经用javascript编写了一个观察者。您可以触发如下事件: ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn) Event.prototype.triggerEvent = function() { var callbacks = this._events[eventName]; if(callbacks !== undefined) { for (var i = 0

我已经用javascript编写了一个观察者。您可以触发如下事件:

ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn)
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);
    }
  }
}
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);      

}
参数数量可变,第一个参数是事件名称。我也有订阅服务器,它们保存在我的事件类的私有属性中。他们被这样称呼:

ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn)
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);
    }
  }
}
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);      

}
Event.prototype.triggerEvent=function(){
var callbacks=this.\u事件[eventName];
如果(回调!==未定义){
for(var i=0,l=callbacks.length;i
但是,订阅者确实知道事件名称,因此可以对其进行修改。但我不知道如何从列表中删除一个参数(因为它不是数组,而是某种对象)

我还需要读取事件名称,一旦它被删除,因为在通知直接订阅者之后,一个全局事件系统开始工作。此全局事件系统需要名称

因此,整个函数如下所示:

ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn)
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);
    }
  }
}
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);      

}
Event.prototype.triggerEvent=function(){
//首先,我们向直接订户提供服务
var callbacks=this.\u事件[eventName];
如果(回调!==未定义){
for(var i=0,l=callbacks.length;i

如何实现这一点?

只需在删除第一个参数的情况下创建一个新数组:

var newArgs = [];
for (var i = 1; i < arguments.length; i++) {
  newArgs.push(arguments[i]);
}
您可以像这样从
Array()
对象“借用”
shift
方法:

ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn)
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);
    }
  }
}
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);      

}
缓存
shift
方法

shift = [].shift;
然后使用它去掉
参数的第一个元素(因为它只是一个类似数组的对象)

正如卡萨布兰卡所说

许多方法可以处理任何行为类似于数组的对象 (数字索引和长度属性)


shift
方法只是其中之一。

Mohamed Ted是正确的,但是如果不需要第一个参数,可以使用
Array.splice
内联参数操作,如下所示:

callbacks[i].apply(callbacks[i], [].splice.call(arguments, 1));

其中
1
表示参数列表中要保留参数的位置。

非常好。我不知道我可以传递一个新数组。。。但很明显。@shreading:JavaScript很奇怪。:)许多方法可以处理任何类似数组的行为(数字索引和
length
属性)。正如您所提到的,
参数
不是一个真正的数组,但是它可以像
应用
的真正数组一样使用。多么糟糕的解决方案!