删除元素并将其添加到 javascript 中的函数参数列表中
Remove and add elements to functions argument list in javascript
我用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);
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数