1

これはちょっとファンキーです。しかし、以下のコードスニペットを見てください:

$('.classname').bind('click', somefunction);

function somefunction() {
  console.log($(this)); // **displays[<div>,context<div>]**
}

そして、私が上記を微調整すると:

$('.classname').bind('click', function(){ somefunction(); });

function somefunction(){
  console.log($(this)); // **displays [Window]**
}

関数がどのようにコールバックされているかに応じて、「this」が2つの異なる値を想定する理由はよくわかりません。問題は、これがコンテキストであり、関数が次のように呼び出される必要があるということです。

function(event){ somefunction(event); }

イベントが必要だから。しかし、ここで何が起こっているのかよくわかりません。

リード、人はいますか?

4

4 に答える 4

2

this関数の受信者です。

実行するobj.someFunction()obj、実行内にあります。

しかし、関数を取得して明示的なレシーバーなしで実行すると(バインドされていなかった場合)、それはグローバルスコープです。つまり、次のようになりwindowます。

function someFunction(){
    console.log(this);
}
var f = obj.someFunction;
f(); // log the window

bind:を使用して関数をバインドできることに注意してください。

 var f = obj.someFunction.bind(obj);
 f(); // log the obj

しかし、通常の解決策は、クロージャを使用することです。これは別の関数であり、これを埋め込みます。

var f = function(){obj.someFunction()};
f(); // log the obj

そのため、jqueryコールバックでこの構造がよく見られます。

$(someselector).click(function(event){
    $(this).someFunction(event)
 }); // this is $(this) and the event is received
于 2012-11-18T19:41:04.947 に答える
1

「なぜ 'this' が関数の呼び出し方法に応じて 2 つの異なる値を想定するのかよくわかりません...」

これがまさにthisJavaScript での動作です。その値は、関数が呼び出された方法に基づいています。


.callまたはを使用して、必要な値に手動で設定できます.apply

$('.classname').bind('click', function(event){ 
                                  somefunction.call(this, event); 
                              });

これで、変更する必要はありませんsomefunction。で呼び出すことにより、最初の引数として渡す値に.call()手動で値を設定します。this

于 2012-11-18T19:50:16.013 に答える
0
$('.classname').bind('click',somefunction);

「run somefunction()on $('.classname')$('.classname')は として渡されることを意味しthisます。

$('.classname').bind('click',function(){somefunction();});

「この匿名関数を実行する」という意味は、$('.classname')匿名関数$('.classname')では ですが、匿名関数内でthis呼び出すと、渡されません。あなたはそれを修正することができます。somefunction()this

$('.classname').bind('click', function(){ somefunction(this); });

function somefunction(x){
  console.log($(x));
}
于 2012-11-18T19:49:51.760 に答える
0

イベントは最初の例でも渡されています

$('.classname').bind('click', somefunction);

function somefunction(e) {
  // e is the event here as well..
  console.log($(this)); // **displays[<div>,context<div>]**
}
于 2012-11-18T19:46:32.293 に答える