我正在使用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。
答案 0 :(得分:2)
这是因为你没有在Spaceship
和Game
函数中使用add_spaceships
变量DEBUGGER 1
和DEBUGGER 2
调试点所在的位置,因此Chrome不会在关闭时捕获此变量。在DEBUGGER 3
中,您使用变量,因此它在闭包中捕获,您可以检查它。