2010-12-03 8 views
0

の有無にかかわらず関数を呼び出します。中括弧を使用して関数thisを呼び出すと、クリックされた要素が参照されません。は、私はしばしばこのように呼ばれる関数を参照してくださいjqueryのスクリプトでかっこスコープの質問

個人的に私はそれが好きではありません。私は自分のコードで使用されているものが関数であるかどうかを確認したい。私は引数としてthisを渡すことを前提としています。これまでの私のやり方です:

var somefunction = function($clickedLink){ 
    $clickedLink.doseomething() 
} 

$(someelement).click(function(){ somefunction($(this)) }); 

私は中括弧を使用しないと、なぜ私はrefared要素にアクセスできますか?そして、中括弧なしで関数を呼び出すことは一般的には良い方法でしょうか?パフォーマンスに影響を与えますか?

答えて

6

これはカッコではなく、イベントハンドラとして使用されるすべての関数、およびjQueryがイベントハンドラを呼び出す方法(バニラJavaScriptでも同じです)です。その関数のコンテキストは、イベントが存在する要素になります発砲。

もう1つの点で少し明確にするには、を呼び出す括弧のない関数を呼び出すと、関数への参照が渡されます。たとえば、これは「ここでイベントが発生したときに実行する機能があります」と言う:

$(someelement).click(somefunction); 

あなたが持っている他の方法は、単に余分な無名関数のより多くのオーバーヘッドで、同じことを行います

$(someelement).click(function(){ somefunction($(this)); }); 

function() { ... }はあなたが実行するために渡しているものです(名前付き関数ではなく、無名関数です)。クリックイベントがsomefunctionの場合、実際にとなるまでは、と呼ばれます。


あなたはそれをいずれかの方法を行うことができますが、あなたは直接関数を渡すとき、彼らは、同じではありませんよ、thisは要素であり、最初の引数は、多くの場合、伝播を停止したりする必要がevent object ...ですデフォルトの動作を正しく防止します。

+0

しかし、中括弧で関数を呼び出すと、 'this'がclicket要素を参照しないのはなぜですか? – meo

+0

@meo - 同じコンテキストを持つ関数を呼び出さないので、このようにコンテキストを維持する必要があります。 '$(someelement).click(function(){somefunction.call(this、$( );)); '...しかし、あなたは' $(someelement).click(somefunction);と比較してどのように冗長であるかを見ています; :) –

+0

あなたに紹介していただきありがとうございます。しかし、私が最初のexmpleを取って、いくつかの関数を呼び出すときに中括弧を追加すると、 'this'はトリガー要素ではありません:/。それは私がそれが中括弧と関係があると思っていた理由です。 – meo

関連する問題