2011-06-26 8 views
3

のは、私が機能を持っているとしましょう:jQueryで関数を呼び出す必要があるのはなぜですか?

function myFunction() { 
... 
} 

は、私は、イベントハンドラからそれを呼びたいです。なぜこの構造が私の機能と呼んでいないのですか?

$(window).resize(myFunction()); 

しかし、これは、トリックを行います。

$(window).resize(function(){myFunction()}); 

呼び出して、これらのタイプの違いは何ですが?

答えて

11
$(window).resize(myFunction()); 

すぐ通話myFunctionresize戻り値を渡します。関数名/参照の後にかっこを追加すると関数が呼び出されます。

一方、

$(window).resize(function(){myFunction()}); 

resize匿名関数を通過します。 myFunctionは、外部関数が呼び出されたときにのみ呼び出されます。

無名関数は何も特別なものではありません。この場合は、のインライン関数定義のようなものです。あなたは簡単に機能を参照して、それを置き換えることができます。

var handler = function(){myFunction()}; // take out the function definition 
$(window).resize(handler); // and replace it with the new name 

今、あなたはhandlerが呼び出されない、参照のみが渡され、意味、何の括弧は、関数名の後に存在しないことがわかります。

この例で新しい関数を作成する必要はありません。


$(window).resize(myFunction); 
しかし、両方の方法は、そのユースケースを持っている:あなたは、単に myFunctionへの参照を渡すことによって、同じことを達成することができます。 myFunctionに渡されたパラメータに依存
function myFunction() { 
    var handler = function() {}; 
    return handler; 
} 

はたぶんハンドラは再調整: myFunction は、イベントハンドラとして使用されるべき機能を返す場合

最初の例$(window).resize(myFunction());はまだ有用です。

あなたには、いくつかの特定の引数でmyFunctionを呼び出したい場合は、無名関数を渡すが必要である:

function myFunction(a, b) { 
    alert(a + b); 
} 

$(window).resize(function(){ 
    myFunction(40, 2); 
}); 

更新:

@T.J. Crowderevent objectに関する重要なコメントをしました。すべてのイベントハンドラは、最初のパラメータとして渡されたイベントオブジェクトを取得します。

function myFunction(event) { 
... 
} 

がそれに(簡単に)アクセス、匿名関数を使用してを持っているとして、あなたの関数を定義したい場合は、それを通過しなければならない:

$(window).resize(function(event){myFunction(event)}); 

をあなたがそれを使用したい場合。

+2

* "myFunction'への参照だけを渡すことで同じ結果を得ることができます:" *少し違います*。その場合、 'myFunction'は' event'引数を受け取りますが、 '$(window).resize(function(){myFunction()});'バージョンでは 'myFunction'は'イベント引数。 –

関連する問題