我在互联网上找到了一个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定义传递给argumentsfn作为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/

10-11 05:08