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") });

另一个用例是单个函数充当多个对象的事件处理程序:

$("#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 回答
1

您可以始终使用闭包,或始终使用上下文,或始终使用其他解决方案,或为任何情况选择任何解决方案。两者都没有错。

您可以使用最适合每种情况的一种,或者您最有信心的一种。

于 2013-05-26T23:06:36.723 回答