0

次の jQuery のコードを見てください。

$button.on("click", {context: "externalRef1"}, function(e){ if (e.data.context){...}  });

いつデータをコンテキストとしてハンドラーに渡す必要があるのだろうか (上記のサンプルのように)、なぜ常にクロージャーに頼ることができないのでしょうか (競合する名前を気にする必要はありません - 実際には問題ではありません)。

いくつかの明確化 - クロージャーは、コードが外部変数を使用できるようにすることに関するものです。

var foo = function(){

    var externalRef = "a1";

    var call = function(){}{
       alert(externalRef); // a1
    }    
};

それが常に当てはまる場合、なぜ上記の方法でデータを渡す必要があるのですか?

4

2 に答える 2

2

実際、これは好みの問題です。私にとって、クロージャはデータを渡すためのより明示的で「自然な」方法です。ただし、状況によってevent.dataは、ループなどで単純に便利な場合があります。

// doesn't do what you want!
for(var i = 0; i < 5; i++)
    $("#button" + i).on("click", function(e) { alert("Button " + i + " clicked") });

// works just fine
for(var i = 0; i < 4; i++)
    $("#button" + i).on("click", {i: i}, function(e) { alert("Button " + e.data.i + " clicked") });

もう 1 つのユース ケースは、複数のオブジェクトのイベント ハンドラーとして機能する単一の関数です。

$("#add_button").on("click", {action: "+"}, calculatorButtonClicked);
$("#mul_button").on("click", {action: "*"}, calculatorButtonClicked);
$("#div_button").on("click", {action: "/"}, calculatorButtonClicked);

function calculatorButtonClicked(e) {

    ...lots of common code

    switch(e.data.action) {
        case '+': result = x + y;
        case '*': result = x * y;
            etc
    }

    ...lots of common code

}
于 2013-05-26T23:29:45.860 に答える