2016-09-18 41 views
1

我有一個名爲鼴鼠模塊:()爲什麼我不能在我的模塊中調用我的構造函數方法?

var Mole = (function(){ 

    function mole(id){ 
    this.id = id; 
    } 

    var randomMole = function(){ 
    var moleIndex = Math.ceil(Math.random() * 8); 
    var mole = moles[moleIndex]; 
    return mole.id; 
    } 

    var score = 0; 

    var moles = []; 

    var generateMoles = function(){ 
    for(var i = 1; i <= 8; i++){ 
     var mole = new mole(i); 
     moles.push(mole); 
    } 
    } 

    return { 

    init: function(){ 
     //var mole = mole; 
     generateMoles(); 
    }, 

    randomMole: randomMole, 

    score: function(){ 
     return score; 
    }, 

    incrementScore: function(){ 
     score += 1; 
    } 
    } 


})() 

我打電話Mole.init當文件已準備就緒。

這將調用generateMoles方法,該方法使用模塊頂部的摩爾構造函數。除了當摩爾構造是我generateMoles函數中調用我得到這個錯誤:

model.js:19 Uncaught TypeError: mole is not a constructor 

爲什麼不是摩爾構造?我將它定義爲模塊頂部的一個。

我認爲這可能是因爲mole函數在init()函數中被調用時不在generateMoles的作用域中,因爲init函數會爲generateMoles創建一個新的閉包,該閉包不包含該構造函數。所以我嘗試了在init函數中定義痣的方法,所以它將被包含在爲生成Moles而給出的閉包中。但是不管我是否這樣做,我仍然會得到相同的錯誤。

所以現在我不知道爲什麼我不能叫新的鼴鼠()..任何幫助將不勝感激。謝謝。

+0

我的模塊稱爲鼴鼠和我由構造的裏面它稱爲摩爾(小寫) ,通過說新的mole()不是我使用我在模塊內定義的構造函數? – srlrs20020

回答

4

var聲明被「懸掛到頂部」(即仍在函數see "var hoisting"內的最外面的範圍)。因此,你generateMoles等同於:

var generateMoles = function(){ 
    var mole; 
    for(var i = 1; i <= 8; i++){ 
    mole = new mole(i); 
    moles.push(mole); 
    } 
} 

當然,這打破了new mole(i)表達,因爲mole不再指mole功能,但該功能內mole變量。

的直接的解決方案,這將是簡單地使用不同的名稱爲本地變量,如m

var generateMoles = function(){ 
    for(var i = 1; i <= 8; i++){ 
    var m = new mole(i); 
    moles.push(m); 
    } 
} 
+0

感謝所以當我宣佈摩爾變量時,它被提升到與摩爾構造函數相同的範圍並覆蓋它? – srlrs20020

+0

@ srlrs20020不,它不會被懸掛在相同的範圍內。它保留在'generateMoles'函數中,但是在那裏它_does_覆蓋'mole',因爲'mole'標識符現在解析爲局部變量而不是函數(並且這也使得'mole'函數不可訪問,因爲你沒有辦法參考它)。儘管'generateMoles'之外,沒有什麼改變。 – Siguza

+0

好吧,有道理謝謝你 – srlrs20020

相關問題