3

コールバック関数からイベント パラメータにアクセスできない理由を同僚に尋ねられました。呼び出しが終了した後、jquery がイベントを null に設定しているように見え、一時的なローカル変数を作成することで問題が解決したことが判明しました (以下を参照)。

それから、なぜ「メッセージ」がコールバックでも利用できるのか、考えさせられました。誰か説明してくれませんか?

$('some seletor').click({msg: message},function(event){
    alert(event.data.msg); //event.data.msg is not available to the json callback because event is null
    var message = event.data.msg; //message will be available to the callback...why?
    $.getJSON('ajax/test.json', function(data) {
        alert(message); //works ok - why is the message variable visible here at all, should it not have gone out of scope when the above function ended?
        alert(event.data.msg); //will crash, seems that event has been set to null by the framework after the function finished
    });    
});
4

3 に答える 3

4

特定のスコープに存在する変数は、そのスコープ内で定義されているすべての関数で使用できます。(これは、スコープが JS で機能するように定義されている方法です。言語仕様のこの部分は、定義方法の核心を知りたい場合に、おそらく適切なエントリ ポイントです)。

コールバックを定義する関数式は、変数を定義する関数内にあるため、変数を使用できます。

于 2013-06-08T08:45:16.783 に答える
3

これを試して:

$('some seletor').click({msg: message},function(ev){
    alert(ev.data.msg);
    var message = ev.data.msg;
    $.getJSON('ajax/test.json', function(data) {
        alert(message);
        alert(ev.data.msg);
    });    
});

の代わりにevent。イベントはグローバルオブジェクトwindow.eventであり、イベントが終了すると未定義になるためです。次のように、パラメーターから取得せずにイベントオブジェクトを使用できます。

$('some seletor').click({msg: message},function(){
    alert(event.data.msg);   
});
于 2013-06-08T08:40:29.833 に答える
0

疑似コードを許すなら - ネストされたブロックと考えてみてください - このようなこと

function foo()
{
  int bar=0;

  //inner block
  {
    bar++;
  }

}

またはより具体的に

function click()
{
 variable {msg: message}

  //inner block
  function(ev) 
  {
   ....     
  }
}
于 2013-06-08T08:56:24.123 に答える