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
の外に置くことを好みます。
は、コールバックとは何の関係もありません、それはあなたが 'myButtonという操作を行う場合、イベントリスナー – epascarello
あなたの第二のコードが動作します結合に関係しています。 addEventListener( 'click'、ThirdFunction(message)); ' - しかし、このようなクロージャをインラインで定義する方が読みやすくなります。最初のコードは、 'thirdFunction(message)'を '()=> thirdFunction(message)'に置き換えると動作します。 –
しかし、私は 'message'を渡すことなく投稿しました。 – user6875880