2017-06-23 9 views
-1

JavaScriptのコールバック関数に多少の曖昧さがあります。引数をコールバック関数に渡す場合

function firstFunction() 
{ 
var message = "something"; 
secondFunction(message); 
} 

function secondFunction(message) 
{ 
    var myButton = document.getElementById("my-button"); 
    myButton.addEventListener('click',thirdFunction(message)); 
} 

function thirdFunction(message) 
{ 
console.log("the messages is: "+message); 
} 

私は上記のスクリプトを実行し、thirdFunctionは、ボタンをクリックせずに実行されます:次のように

最初のコードが構成されています。

若干の調査の後で、私はclosureについてジャバスクリプトで読んでいます。次にコードを次の構造に変更しました:

function firstFunction() 
{ 
var message = "something"; 
secondFunction(message); 
} 

function secondFunction(message) 
{ 
    var myButton = document.getElementById("my-button"); 
    myButton.addEventListener('click',thirdFunction); 
} 

function thirdFunction(message) 
{ 
    return function(){ 
    console.log("the messages is: "+message); 
    } 
} 

私は期待した結果を得ました。 thirdFunctionは、ボタンをクリックしたときにのみ実行されます。

私の2番目のコード構造が正しいかどうか分かりませんか?以前のプログラミングで関数を返すことはなかったので、私はクロージャの概念を正しく得ているかどうかはわかりません。これは私にとって新しい概念です。私が間違っているなら、私を修正してください。ソリューションの一部はこのようにそれを書くことをお勧め :

EDITコードの可読性のために

myButton.addEventListener('click', function() { thirdFunction(message) }); 

、私はこれを避けるためにしようとしています。私はthirdFunctionのコードをsecondFunctionの外に置くことを好みます。

+0

は、コールバックとは何の関係もありません、それはあなたが 'myButtonという操作を行う場合、イベントリスナー – epascarello

+1

あなたの第二のコードが動作します結合に関係しています。 addEventListener( 'click'、ThirdFunction(message)); ' - しかし、このようなクロージャをインラインで定義する方が読みやすくなります。最初のコードは、 'thirdFunction(message)'を '()=> thirdFunction(message)'に置き換えると動作します。 –

+0

しかし、私は 'message'を渡すことなく投稿しました。 – user6875880

答えて

0

は正しい環境でクロージャを作るために無名関数を使用します。

function secondFunction(message) 
{ 
    var myButton = document.getElementById("my-button"); 
    myButton.addEventListener('click', function() { 
    thirdFunction(message) 
    }); 
} 
関連する問題