javascript模块模式上下文问题

时间:2016-02-12 18:31:23

标签: javascript

我在学习模块模式时遇到了麻烦,

从安装程序中运行我的函数getData的正确方法是什么,目前尚未定义。

https://jsbin.com/movaleyedo/edit?html,js,console,output



var module = (function(){
  var Setup = function(){
    this.getData = function(){
      return "data";
    };
    this.init = function(){
      
      this.getData(function(err,data){
         alert(data);
      });
    };
  };
  return {
    init: new Setup().init
  };
})();
module.init();




"TypeError: this.getData is not a function
at Object.init (movaleyedo.js:8:12)
at movaleyedo.js:17:8
at https://static.jsbin.com/js/prod/runner-3.35.9.min.js:1:13891
at https://static.jsbin.com/js/prod/runner-3.35.9.min.js:1:10820"

我已经创建了第二个例子,为什么我不明白发生了什么。



var Module = (function(){
  var app = this;
  var One = function(){
    this.one = function(){
      return 1;
    }
    this.getNumbers = function(){
      return this.one();
    }
  };
  
  var Two = function(){
    this.getNumbers = function(){
      return 2;
    }
    this.two = function(){
      app.one = new One;
      console.log(app.one.getNumbers()); //doesnt break
      console.log(this.getNumbers());//breaks
    }
  };
  
  return {
    init: new Two().two
  };
  
})();
Module.two();




基本上在One()中,我可以调用return this.one()。

但在Two()里面我不能调用this.getNumbers()

2 个答案:

答案 0 :(得分:2)

输入this.init后,您已更改了上下文,this不再指向您正在构建的对象。要解决此问题,您可以将this缓存在构造函数顶部的变量中,以供日后参考:

var module = (function(){
  var self = this;   // <------ Add this line
  var Setup = function(){
    this.getData = function(){
      return "data";
    };
    this.init = function(){
      
      self.getData(function(err,data){  // <------ update this line
         alert(data);
      });
    };
  };
  return {
    init: new Setup().init
  };
})();
module.init();

你也在传递getData()一个它没有调用的回调。您还应该查看user1695032s的答案

答案 1 :(得分:2)

实现是同步,调用是异步

this.getData = function(){
  return "data";
};

this.getData(function(err,data){
   alert(data);
});

//should be used either
var data = this.getData();
alert(data);

//or defined as

this.getData = function(callback){
  callback(null, "data");
};

另外一个用户是对的,你只传递了这个功能。使用&#34;这个&#34;该函数中的关键字将引用其他内容。为什么不传递实例本身或创建实例?

类似这样的事情

return new Setup();

module.init();

return Setup;

var instance = new module();
instance.init();