PubSub脚本不接受变量

时间:2016-10-12 23:27:55

标签: javascript jquery

我在互联网上找到了一个PubSub脚本,效果很好,不幸的是我不完全理解它是如何工作的......

直到现在这还不是问题。对于一个项目,我需要通过这个pubsub脚本调用一个函数并传递一些参数。但是,该函数似乎不接受任何arguemnts,只传递其事件的更改变量。

以下是订阅PubSub事件并调用函数的代码行:

events.on( 'scrollChanged', self.translate );

正如您所知,事件是一个滚动事件,传递的值是滚动的像素数。

这一行代表一个jQuery插件,我目前正在开发它并且应该充当函数调用,我们通常会这样:self.translate()

到目前为止,一切运行良好,但translate函数还需要来自init - 函数(从中调用它)的一些其他变量。 通常我会写:

[...]
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 - 函数的这一行:

  

FN(数据);

告诉我,fn未定义。

如果没有传递任何参数,那么emit的代码效果很好:

$(window).scroll(function(){
  var yScroll = $(this).scrollTop();

  events.emit('scrollChanged', yScroll);
});

1 个答案:

答案 0 :(得分:0)

在第二个参数处将函数引用传递给.on(),而不是通过调用()立即调用函数;将rest parameters定义为emit的第二个参数,使用spread element处的解构分配fn来定义传递给arguments的{​​{1}}作为fn内的数组{1}}功能正文

fn