我在学习模块模式时遇到了麻烦,
从安装程序中运行我的函数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()
答案 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();