2016-10-06 21 views
2

のプロパティ「doThings」を読み取ることができません、私は美しくobjキャッチされない例外TypeError:未定義

var nodesArray = []; 

var obj = function(nodeSpan){ 
    this.nodeS = nodeSpan; 

    this.doThings = function(){ 
      console.log(this.nodeS); 
    }; 
} 

が移入されるノードの配列を持って、私はnodeArray

var newObj = new obj(thisIsASpan) ///trust me that's a span 
nodesArray.push(newObj); 
//etc 
obj年代の多くを置きます

各ノードでmap関数を呼び出し、イベントリスナーを追加します。

Array.prototype.map.call(nodesArray, function(obj, index) { 
     obj.nodeS.addEventListener('click', function(obj, index) { 
       nodesArray[index].doThings(); ////Throws error in title. 
     }); 
}); 

私は気になるスパンの1つをクリックします。

タイトルに間違いがありましたら、私は休憩室を歩いて、次に故障します。

+0

私はnodesArrayをconsole.logingすることから始め、その後、それはあなたがそれだと思う同じように働いているかどうかを確認...その後はconsole.logインデックスとインデックスが正しく渡された@jdave – jdave

+0

を出してobjう'addEventListener' –

+0

ところで、変数に実際の配列が含まれている場合、' Array.prototype.map.call'を使う必要はありません。ちょうど 'nodesArray.map(...)'を使ってください。複雑な構文は、配列のようなオブジェクトにのみ必要です。 – Barmar

答えて

3

クリックを定義するときにobjとindexを追加しないでください。クリックが発生したときにobjとindexが設定されます。あなたのケースでは、最初の引数はイベントオブジェクトで、2番目の引数は未定義です。なぜなら、クリックには1つの引数しかないからです。

Array.prototype.map.call(nodesArray, function(obj, index) { 
     obj.nodeS.addEventListener('click', function(event) { 
       nodesArray[index].doThings(); 
     }); 
}); 
+0

私は@epascarelloを抱擁 –

+0

しかし、真剣に、なぜaddEventListenerはインデックスにアクセスできますか?インデックスを明示的に渡すことができないのはなぜですか? –

+0

変数が同じブロックスコープにあるためです。 – epascarello

関連する問題