2016-02-12 120 views
0

我無法學習模塊模式,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();

基本上裏面一(),我可以調用返回this.one()。

但內部的兩個()我不能叫this.getNumbers()

+0

請相關的代碼添加到這個問題(內聯)。如果你需要運行某些東西,可以使用[Stack Snippets](https://blog.stackoverflow.com/2014/09/introducing-runnable-javascript-css-and-html-code-snippets/)。 – Whymarrh

+0

'this'不是你想要的。 – SLaks

回答

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"); 
}; 

也是其他用戶是對的,你是唯一的傳遞函數。在該函數中使用「this」關鍵字將引用其他內容。爲什麼不通過實例本身或創建實例?

像這樣

return new Setup(); 

module.init(); 

return Setup; 

var instance = new module(); 
instance.init(); 
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回答以及