2017-04-09 40 views
0

私は複数の選択に対して機能する単一の関数を作成しようとしています。私はこのように動作するはずのビデオゲームの選択画面を作成しています:https://oege.ie.hva.nl/~meestej005/eind/引数を持つ関数を `addEventListener`に渡す

私は、これは、このコードでいた達成する方法を:

function character1(){ 
for (var i = 0; i < sprite.length; i++){ 
    sprite[i].classList.remove('charSprite'); 
} 
sprite[0].classList.add('charSprite'); 
hadouken.play(); 
} 

私はこの機能を4回、各文字の1を作りました。

char1.addEventListener('click', character1); 

今は、各文字に対してこれを行う関数を作成したいと考えています。これは私が思いついたものです:

function character(name, music){ 
for (var i = 0; i < sprite.length; i++){ 
    sprite[i].classList.remove('charSprite'); 
} 
name.classList.add('charSprite'); 
music.play(); 
} 

char1.addEventListener('click', character(charSprite1, hadouken)); 

悲しいことに、これは動作しません。文字の1つをクリックすると、エラーは発生しません。だから私は何か間違っているが、何が分からないのか。私はJavascriptだけを使ってこれを修正したいと思います。私はあなたが私を助けてくれることを願っています。ありがとう。

答えて

1

addEventListenerは、2番目の引数として関数をとります。 character(charSprite1, hadouken)のような関数を呼び出すと、その関数参照をもう通さなくなります(その代わりに、イベントが発生したときではなく、というすぐにと呼ばれるその関数の結果を渡しています)。

function character(name, music) { 
    return function() { 
    for (var i = 0; i < sprite.length; i++) { 
     sprite[i].classList.remove('charSprite'); 
    } 
    name.classList.add('charSprite'); 
    music.play(); 
    } 
} 

char1.addEventListener('click', character(charSprite1, hadouken)); 
+0

を私は感謝、これはどのように機能するかをより多くのを理解し始めている:私は、クロージャを使用してnamemusic引数をキャプチャし、characterから機能を毎回返すお勧めします。しかし閉鎖によってあなたはどういう意味ですか?そして私はどのような機能を返すべきですか? – H0ndman2

+0

closure [here](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work#111111)についてさらに読む。上記のコードの 'return function'は、' name'と 'music'を"キャプチャ "できるこの解決策の一部です。 – gyre

+0

もっと簡単な方法は、バインディングを渡すことです。 –

関連する問題