查看以下jQuery的代码:
$button.on("click", {context: "externalRef1"}, function(e){ if (e.data.context){...} });
我想知道何时应该将数据作为上下文传递给处理程序(根据上面的示例)以及为什么我不能总是依赖于闭包(永远不要说出相互矛盾的名字 - 这不是真正的问题)?
一些澄清 - 关闭是允许代码使用外部变量,即
var foo = function(){
var externalRef = "a1";
var call = function(){}{
alert(externalRef); // a1
}
};
如果总是如此,为什么你需要按照上面指出的方式传递数据呢?
答案 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)
您可以随时使用闭包,或始终使用上下文,或始终使用其他解决方案,或者针对任何情况选择任何解决方案。两者都不对。
您可以使用最适合每种情况的那种,或者您最有信心的那种。