我正在使用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。

最佳答案

发生这种情况是因为您没有在SpaceshipGame调试点所在的add_spaceshipsDEBUGGER 1函数内使用DEBUGGER 2变量,因此Chrome不会在闭包中捕获此变量。在DEBUGGER 3中,使用变量,因此将其捕获在闭包中,您可以对其进行检查。

07-24 16:23