我正在改善Javascript结构并尝试找出自己喜欢的模式,我有以下几点:

var aThing = (function() {

  var module;

  return {

    init: function() {
      module = this;
      console.log(module);
    },

  };

})();


当我运行aThing.init();并记录Object {init: function}时,这就是我想要的,当我执行以下操作时出现问题:

document.addEventListener('click', aThing.init, false);


这将记录#document。当我在不带括号的情况下运行函数时,this似乎正在发生变化,我也不知道为什么。

最佳答案

这都是关于执行上下文的。尽管您的init方法位于aThing模块内部,但是您在其他地方执行该方法,因此对“ this”关键字的使用将引用执行上下文。

与其在模块之外编写事件处理程序,不如考虑利用模块本身来处理它。可以从模块的init方法内部完成此操作,这将为您提供更整洁的结构,因为您将与模块有关的所有内容都存储在模块本身内部,而不是在模块外部和内部进行其他操作。

见下文:



var aThing = (function() {

  var module;

  return {

    init: function() {
      module = this;

      // Handle event binding from somewhere within your module
      document.addEventListener('click', module.doSomething, false);
    },

    doSomething: function () {
      console.log('Doing something.');
    }
  };

})();

// Initialize your module
aThing.init();

关于javascript - JS对象文字,此上下文不断变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27801661/

10-10 19:32