gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:44:21 24 4
gpt4 key购买 nike

我有一个名为 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 方法,该方法使用模块顶部的鼹鼠构造函数。除了在我的 generateMoles 函数中调用 mole 构造函数时,我收到此错误:

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

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

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

所以现在我不知道为什么我不能调用 new 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com