2

これとともに

例 1

$("#my_div").on("click", function () {
    alert( $(this).attr("id") )
});

正しい結果が得られますが、これを使用すると:

例 2

function thisId () {
    alert( $(this).attr("id") )
}

$("#my_div").on("click", function () {
    thisId();
});

現在、結果は未定義です。例 2thisのように、セレクターと関数の使用thisが別の式で記述されている場合、どのように使用すればよいか教えてください。

4

2 に答える 2

8

jQuery が要素参照を関数に渡すには、関数を参照として提供する必要があります。これを試して:

$("#my_div").on("click", thisId);

@bot の更新

function thisId (event) {
    alert( $(this).attr("id") )
    alert(event.type);
}

$("#my_div").on("click", thisId);
于 2012-11-08T17:26:17.950 に答える
2

@RoryMcCrossanの答えは正しいものです。理由は次のとおりです。JSはアドホックthisを参照するものを決定します。つまり、関数が呼び出されると、呼び出しコンテキストを調べます。

myObject.property = function(){console.log(this)}
myObject.property();
  /\          ||
  ||who called |
  |_____________

関数がオブジェクトのメソッドとして呼び出されなかった場合thisId( . および を使用して、プログラムで呼び出しコンテキストを決定できます。これは、jQuery が舞台裏で行うことです。thiswindow
functionName.call(context)functionName.apply(context,[arguments]);

$.fn.on(evt,callback)//simplified
{//jQ sets up its own event handler that looks like this:
    //here, this point to $("#my_div") in your case, so:
    var jQhandler = function(e)
    {
        callback.apply(this,[e]);//passes the event as an argument
    };
    this.addEventListener(evt,jQhandler,false);//<-- passes its handler by reference
}

したがって、この使用適用のいずれかを実行できます。これには、-あなたの場合-さらに別の anon が必要です。関数オブジェクトを作成するか、関数を直接 jQuery にコールバックとして渡します。後者ははるかに効率的です。冗長性が低く、必要な関数オブジェクトも少なくなります。

これが要するに、@RoryMcCrossan が正しい理由であり、JS が世界で最も誤解されている言語であると考える人もいる理由です。JS を使用する大部分の人々は、JS がコンテキストを決定する方法について本当に知りません。


補足として: ECMA5 では、.bindメソッドを使用して関数をコンテキストにバインドできますが、それではトピックから大きく外れてしまいます...

于 2012-11-08T17:39:50.017 に答える