在javascript中删除并向函数参数列表添加元素
我已经用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
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
属性)。正如您所提到的,参数
不是一个真正的数组,但是它可以像应用
的真正数组一样使用。多么糟糕的解决方案!