2016-05-05 5 views
2

私はJavascriptを使ってゲームを作っています。私はモジュールをバンドルするためにwebpackを使用しているので、各Javascriptファイルの最後にはmodule.exportsを使用します。私はSpaceshipにクロームのdevのツールおよびタイプを開いた場合、次のように私は機能randomSpaceshipを変更した場合、私はUncaught ReferenceError: Spaceship is not defined(…)機能が一番上にあるときにスクリプトの特定のポイントで機能が定義されないのはなぜですか?

を取得し、上記デバッグの各点で

//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 
} 

:ここでは一例である

Game.prototype.randomSpaceship = function() { 
    //DEBUGGER 3 
    var s = new Spaceship(); 
} 

DEBUGGER 3では、Spaceshipが定義されています(私が開発ツールを開いた場合、Spaceshipは関数になります)。

どうしてですか?私はそれがおそらく可変ホイストと関係があると思っていましたが、ファイルgame.jsの上に可変スペースシップを宣言して割り当てています

+0

関数式を使用する場合、値は実行時まで割り当てられません。それが起こる前に変数を調べているかもしれません。式を宣言に変更します。 '関数宇宙船(オプション){...}'を使うと、別の結果が得られるかもしれません。 – RobG

+0

@RobG、どういう意味ですか?私は関数の宣言で試してみましたが、関数内で直接参照されていなければ、変数は検査のためにまだ利用できません。 –

答えて

2

あなたはDEBUGGER 1DEBUGGER 2デバッグポイントが置かれているGameadd_spaceships関数内Spaceship変数を使用していないので、Chromeが閉鎖にこの変数をキャプチャしていないので、これが起こります。 DEBUGGER 3では、変数を使用するので、クロージャーでキャプチャされ、検査することができます。

+0

無駄なデバッガです。 – Oriol

+0

SpaceshipはGameとadd_spaceships以外のスコープで宣言され、割り当てられていませんか?これは、ファイルgame.jsの中のグローバル変数のようなものですか?このファイル内のすべてのクロージャーに含まれていてはいけませんか? – evianpring

+0

@evianpring、いいえ、グローバルではありません。webpackはコードを関数にラップし、ビルドされたファイルを確認します。 –

関連する問題