2016-09-18 38 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

相关问题