我正在使用Javascript制作游戏。我使用webpack捆绑模块,因此在每个Javascript文件的末尾都使用module.exports
。这是一个例子:
//spaceship.js
var Spaceship = function(options) {
this.position = options.position
this.name = options.name
}
module.exports = Spaceship
//game.js
var Spaceship = require("./spaceship");
var Game = function() {
this.num_spaceships = 5;
this.spaceships = [];
// DEBUGGER 1
this.add_spaceships();
}
Game.prototype.add_spaceships = function() {
// DEBUGGER 2
for(var i = 0; i < this.num_spaceships; i++) {
this.spaceships.push(this.randomSpaceship
}
}
Game.prototype.randomSpaceship = function() {
//DEBUGGER 3
}
在上面的每个调试点,如果我打开Chrome开发工具并输入
Spaceship
,则会得到Uncaught ReferenceError: Spaceship is not defined(…)
如果我按以下方式更改功能
randomSpaceship
:Game.prototype.randomSpaceship = function() {
//DEBUGGER 3
var s = new Spaceship();
}
然后在DEBUGGER 3中,现在定义了
Spaceship
(如果我打开开发工具,我将知道Spaceship是一个函数)。为什么会这样?我以为它可能与变量提升有关,但是我在文件game.js的顶部声明并分配了变量Spaceship。
最佳答案
发生这种情况是因为您没有在Spaceship
和Game
调试点所在的add_spaceships
和DEBUGGER 1
函数内使用DEBUGGER 2
变量,因此Chrome不会在闭包中捕获此变量。在DEBUGGER 3
中,使用变量,因此将其捕获在闭包中,您可以对其进行检查。