删除元素并将其添加到 javascript 中的函数参数列表中

Remove and add elements to functions argument list in javascript

本文关键字:函数 参数 列表 javascript 元素 添加 删除      更新时间:2023-09-26

我用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);      
}

您将如何实现这一点?

你可以从Array()对象中"借用"shift方法,如下所示:

缓存shift方法

shift = [].shift;

然后使用它来取下arguments的第一个元素(因为它只是一个类似对象的数组)

var firstArg = shift.apply(arguments); //in case you need it
.
.
.
callbacks[i].apply(callbacks[i], arguments);

正如@casablanca所说,

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

shift方法只是其中之一。

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

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

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

只需创建一个删除第一个参数的新数组:

var newArgs = [];
for (var i = 1; i < arguments.length; i++) {
  newArgs.push(arguments[i]);
}

并将新数组传递给apply

callbacks[i].apply(callbacks[i], newArgs);