jQuery事件处理程序关闭与上下文

时间:2013-05-26 23:00:42

标签: javascript jquery closures

查看以下jQuery的代码:

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

我想知道何时应该将数据作为上下文传递给处理程序(根据上面的示例)以及为什么我不能总是依赖于闭包(永远不要说出相互矛盾的名字 - 这不是真正的问题)?

一些澄清 - 关闭是允许代码使用外部变量,即

var foo = function(){

    var externalRef = "a1";

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

如果总是如此,为什么你需要按照上面指出的方式传递数据呢?

2 个答案:

答案 0 :(得分: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

}

答案 1 :(得分:1)

您可以随时使用闭包,或始终使用上下文,或始终使用其他解决方案,或者针对任何情况选择任何解决方案。两者都不对。

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