2016-08-18 9 views
0

に必要なのはなぜ匿名関数ラッパーの満足な説明を求めて:javascriptの - 私はこれが機能することを知っているコールバック

$("#btn_1").click(function() { 
    alert("Btn 1 Clicked"); 
}); 

これはちょうど途中で警告ダイアログをポップアップ表示中:

$("#btn_1").click(alert("Btn 1 Clicked");); 

マイQは次のようになります。 2番目のケースでは、なぜ警告が実行される前にをクリックしても、をクリックしないでください。

+2

のいずれかを使用して呼び出す関数を参照することができます '警告(someFunc())'考えてみましょう - 最初の実行される機能、 '警告()'や 'someFunc()'? 'alert(someFunc(anotherFunc()))' ... – nnnnnn

+0

中学校から 'PEMDAS'を覚えていますか? 'P'もここに適用されます。 – dandavis

答えて

2

関数を呼び出すと、引数がすぐに実行され、関数に渡すパラメータが提供されるためです。あなたが書くときに

var temp = arg; 
func(temp); 

$("#btn_1").click(alert("Btn 1 Clicked")); 

それはと同等です:

func(arg); 

はと等価であることは明らかである

var temp = alert("Btn 1 Clicked"); 
$("#btn_1").click(temp); 

、この形で、 0を呼び出す前にアラートが発生するを使用して、イベントのリスナーを追加します。

アクションを遅らせるには、引数として関数を指定する必要があります。関数定義自体は、コードの実行を引き起こさず、後で呼び出されるときにのみ実行されます(これはコールバックと呼ばれます)。

匿名関数である必要はありませんが、名前を付けることもできます。

function myAlert() { 
    alert("Btn 1 Clicked"); 
} 
$("#btn_1").click(myAlert); 

しかし、あなただけの.click()の引数として関数の名前を提供していることに注意してください、すぐにそれを呼び出しますので、あなたは、クリックイベントが発生するまで遅らせない、myAlert()を書いていません。

@Titusが述べたように、click()は、コールバックとして実行する必要があるため、その引数が関数であると想定しています。しかし、あなたは機能を返すために別の関数を呼び出すことができます。

function alerter(message) { 
    return function() { 
     alert(message); 
    } 
} 
$("#btn_1").click(alerter("Btn 1 Clicked")); 

お知らせalerter()ことが直接alert()を呼び出すことはありません、それが呼び出されたときにalert()を呼び出す別の関数を返します。上記のように、clickイベントがそのコールバックを実行するまでは起こりません。

+0

私はこの答えが好きです。そしてこれに、@ Titusの説明(下記)を追加して、 '.click'が関数の結果ではなく引数として関数を期待するようにします。 –

+1

@ user1883050 - 関数呼び出しの結果が関数への参照であれば問題ありません。 – nnnnnn

+1

別の関数を返す関数の例を追加しました。 – Barmar

2

は、ここで私が考えることができる最良の説明です:

var alertResult = alert('Btn 1 clicked'); 
button.addEventListener('click', alertResult); // say waaat? 
var alertFunction = function() { 
    alert('Btn 1 clicked'); 
}; 
button.addEventListener('click', alertFunction); // Yess! 
1

click(...)関数は、引数としての機能を期待し、あなたが機能を渡していない、あなたはそれを関数の結果を渡しています。

はこのことを考えてみましょう:func(1+2)funcメソッドの引数は3(結果)ない1 + 2(操作自体)になります。

1

My Q is:2番目のケースでは、アラートがクリックを待つのはなぜですか? 実行前ですか?

あなたはこの関数を呼び出しています。

あなたはeventが発生したときに.bind()

$("#btn_1").click(alert.bind(window, "Btn 1 clicked")); 
関連する問題