为什么我不能在模块中调用构造函数方法?

时间:2016-09-18 14:28:05

标签: javascript

我有一个名为Mole的模块:

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方法,该方法使用模块顶部的mole构造函数。除了在我的generateMoles函数中调用mole构造函数之外,我得到了这个错误:

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

为什么鼹鼠不是构造函数?我将它定义为模块顶部的一个。

我认为这可能是因为在init()函数中调用mole方法时,它不在generateMoles的范围内,因为init函数会为generateMoles创建一个新的闭包,它不包含mole构造函数。所以我尝试了在init函数中定义mole的方法,因此它将被包含在给generateMoles赋予的闭包中。但是,无论我是否这样做,我仍然会得到相同的错误。

所以现在我没有想法为什么我不能叫新的鼹鼠()..任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:4)

var声明得到了#34;被提升到顶部&#34; (即仍然在函数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);
  }
}