2016-09-18 7 views
1

私はほくろと呼ばれるモジュールがあります。モジュール内でコンストラクタメソッドを呼び出すことができないのはなぜですか?

var Mole = (function(){ 

    function mole(id){ 
    this.id = id; 
    } 

    var randomMole = function(){ 
    var moleIndex = Math.ceil(Math.random() * 8); 
    var mole = moles[moleIndex]; 
    return mole.id; 
    } 

    var score = 0; 

    var moles = []; 

    var generateMoles = function(){ 
    for(var i = 1; i <= 8; i++){ 
     var mole = new mole(i); 
     moles.push(mole); 
    } 
    } 

    return { 

    init: function(){ 
     //var mole = mole; 
     generateMoles(); 
    }, 

    randomMole: randomMole, 

    score: function(){ 
     return score; 
    }, 

    incrementScore: function(){ 
     score += 1; 
    } 
    } 


})() 

文書の準備ができたとき、私はMole.init()を呼び出しています。

これは、モジュールの上部にあるモルコンストラクタを使用するgenerateMolesメソッドを呼び出します。モルコンストラクタは私のgenerateMoles関数内で呼び出された場合を除き、私はこのエラーを取得する:

model.js:19 Uncaught TypeError: mole is not a constructor 

なぜコンストラクタをはモルれていませんか?私はそれをモジュールの一番上のものとして定義しました。

モルのメソッドがgenerate()関数で呼び出されたときに、moleメソッドがgenerateMolesの範囲にないため、init関数がmoleコンストラクタを含まないgenerateMolesの新しいクロージャを作成するためです。だから私はinit関数でモルを定義することを試みたので、generateMolesに与えられたクロージャにインクルードされます。しかし、私はこれを行うかどうかにかかわらず同じエラーを受け取ります。

だから私はなぜ新しいモル()を呼び出すことができないのか考えていません。どんな助けでも大歓迎です。ありがとう。

+0

私のモジュールはほくろと呼ばれ、私はそれの内部コンストラクタは、モル(小文字)と呼ば行われ、新しいmole()と言って私はモジュール内で定義したコンストラクタ関数を使用していませんか? – srlrs20020

答えて

4

var宣言は、「上に」(すなわち、関数see "var hoisting"内にまだ残っている最も外側のスコープに)上がります。したがって、あなたのgenerateMolesは同等です:もちろん

var generateMoles = function(){ 
    var mole; 
    for(var i = 1; i <= 8; i++){ 
    mole = new mole(i); 
    moles.push(mole); 
    } 
} 

このmoleはもはやmole機能するのではなく、その関数内mole変数を参照するため、new mole(i)表現を壊しません。

これに対する簡単な解決策は単純なmとして、ローカル変数に別の名前を使用することです:

var generateMoles = function(){ 
    for(var i = 1; i <= 8; i++){ 
    var m = new mole(i); 
    moles.push(m); 
    } 
} 
+0

ありがとう、モル変数を宣言したとき、それはモル生成者と同じスコープに持ち上げられ、それを上書きしていましたか? – srlrs20020

+0

@ srlrs20020いいえ、それは同じ範囲に吊り上げられません。それは 'generateMoles'関数内にとどまりますが、' mole'識別子は関数の代わりにローカル変数に解決されるという意味で 'mole'をオーバーライドします(そして' mole'関数はアクセス不可能になります)。それを参照する方法はありません)。しかし、 'generateMoles'の外側では何も変わりません。 – Siguza

+0

おかげさまであなたに感謝します – srlrs20020

関連する問題