当我要求顶部的函数时,为什么我的脚本中的某些点没有定义函数?

时间:2016-05-05 20:02:49

标签: javascript webpack

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

1 个答案:

答案 0 :(得分:2)

这是因为你没有在SpaceshipGame函数中使用add_spaceships变量DEBUGGER 1DEBUGGER 2调试点所在的位置,因此Chrome不会在关闭时捕获此变量。在DEBUGGER 3中,您使用变量,因此它在闭包中捕获,您可以检查它。