我在互联网上找到了一个PubSub脚本,该脚本工作得很好,但是不幸的是,我不完全了解它的工作原理...
到目前为止,这不是问题。对于项目,我需要通过此pubsub脚本调用一个函数并将其传递一些参数。但是,该函数似乎不接受任何争论,而仅传递其事件的已更改变量。
这是预订PubSub事件并调用函数的代码行:
events.on( 'scrollChanged', self.translate );
您可能知道,该事件是滚动事件,传递的值是滚动像素的数量。
该行位于我当前正在开发的jQuery插件内部,应作为函数调用,通常我们会这样写:
self.translate()
到目前为止,一切都运行良好,但是
translate
函数还需要init
-function(从中调用)其他一些变量。所以通常我会写:
[...]
init: function( options, this ) {
// Logic
self.translate(var1, var2);
},
translate: function( var1, var2 ) {
// Logic
}
[...]
要在滚动时更新功能,我需要使用
events.on( 'scrollChanged', self.translate );
函数调用它,还需要传递yScroll
变量进行一些计算。但是,如果我将两个变量传递给它,则只会收到错误消息,告诉我该函数未定义。// Exchanged `self.translate(var1, var2);` in the above code by:
events.on( 'scrollChanged', self.translate(var1, var2) );
所以我猜,PubSub代码不接受任何其他变量?!
希望任何人都能帮助我。
PubSub代码
var events = {
events: {},
on: function (eventName, fn) {
this.events[eventName] = this.events[eventName] || [];
this.events[eventName].push(fn);
},
off: function(eventName, fn) {
if (this.events[eventName]) {
for (var i = 0; i < this.events[eventName].length; i++) {
if (this.events[eventName][i] === fn) {
this.events[eventName].splice(i, 1);
break;
}
};
}
},
emit: function (eventName, data) {
if (this.events[eventName]) {
this.events[eventName].forEach(function(fn) {
fn(data);
});
}
}
};
在
emit
-function的这一行中发生错误:并告诉我,
fn
没有定义。这是
emit
的代码,如果未传递任何参数,则效果很好:$(window).scroll(function(){
var yScroll = $(this).scrollTop();
events.emit('scrollChanged', yScroll);
});
最佳答案
将函数引用传递给第二个参数.on()
,而不是通过调用()
立即调用函数;定义rest parameters
作为emit
的第二个参数,使用解构赋值,在spread element
处使用fn
定义传递给arguments
的fn
作为fn
函数体内的数组
var events = {
events: {},
on: function (eventName, fn) {
this.events[eventName] = this.events[eventName] || [];
this.events[eventName].push(fn);
},
off: function(eventName, fn) {
if (this.events[eventName]) {
for (var i = 0; i < this.events[eventName].length; i++) {
if (this.events[eventName][i] === fn) {
this.events[eventName].splice(i, 1);
break;
}
};
}
},
emit: function (eventName, ...data) {
if (this.events[eventName]) {
this.events[eventName].forEach(function(fn) {
fn(data);
});
}
}
};
function cb() {
var [args] = [...arguments];
console.log(args, args[0], args[1]); // `["abc", 123]`, `"abc"`, `123`
}
events.on("scrollChanged", cb);
events.emit("scrollChanged", "abc", 123);
关于javascript - PubSub脚本不接受变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40009949/