我有一个名为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的闭包中。但是无论是否执行此操作,我仍然会遇到相同的错误。
所以现在我不知道为什么我不能调用新的mole()了。任何帮助将不胜感激。谢谢。
最佳答案
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);
}
}
关于javascript - 为什么不能在模块中调用构造函数方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39558717/