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

Why can't I call my constructor method within my module?

本文关键字:调用 构造函数 方法 模块 不能 我的 为什么      更新时间:2023-09-26

我有一个叫做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

为什么mole不是构造函数?我把它定义为模块顶部的1。

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

所以现在我不知道为什么我不能调用new mole()..任何帮助都将非常感激。谢谢。

var声明被"提升到顶部"(即到仍然在函数内的最外层作用域,参见"var hoist ")。因此,您的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);
  }
}