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

Javascript jQuery事件处理程序闭包与上下文,javascript,jquery,closures,Javascript,Jquery,Closures,查看以下jQuery代码: $button.on("click", {context: "externalRef1"}, function(e){ if (e.data.context){...} }); 我想知道什么时候我应该将数据作为上下文传递到处理程序中(根据上面的示例),为什么我不能总是依赖闭包(不必指定冲突的名称-这不是一个真正的问题) 一些澄清-闭包是关于允许代码使用外部变量,即 var foo = function(){ var externalRef = "a1";

查看以下jQuery代码:

$button.on("click", {context: "externalRef1"}, function(e){ if (e.data.context){...}  });
我想知道什么时候我应该将数据作为上下文传递到处理程序中(根据上面的示例),为什么我不能总是依赖闭包(不必指定冲突的名称-这不是一个真正的问题)

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

var foo = function(){

    var externalRef = "a1";

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

如果总是这样,为什么需要按上面指出的方式传递数据?

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


您可以使用最适合每种情况的解决方案,也可以使用您最自信的解决方案。

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


你可以选择最适合每种情况的,或者你最自信的。实际上,这是一个品味的问题。对我来说,闭包是传递数据的更明确和“自然”的方式。但是在某些情况下,
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") });

实际上,这是一个品味问题。对我来说,闭包是传递数据的更明确和“自然”的方式。但是在某些情况下,
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") });

我不确定我是否理解你的问题。。。这个代码来自哪里?我们需要了解您为什么使用此
上下文
值的背景知识?我使用外部值,因为我需要从事件处理程序以外的其他范围访问某些内容。不同的情况需要不同的技术。闭包变量只能直接访问该范围内的函数,而作为事件数据提供的对象可以自由传递和共享。在每个给定的时间使用有意义的东西。我不确定我是否理解你的问题。。。这个代码来自哪里?我们需要了解您为什么使用此
上下文
值的背景知识?我使用外部值,因为我需要从事件处理程序以外的其他范围访问某些内容。不同的情况需要不同的技术。闭包变量只能直接访问该范围内的函数,而作为事件数据提供的对象可以自由传递和共享。在每个给定的时间使用有意义的东西。实际上,我遇到了一个闭包不起作用的情况,我正在寻找一个通用的原因。简言之,闭包不能处理作为参数传递到更高范围然后缓存的变量。@user1514042:我看不出闭包不起作用的原因。如果您正在谈论thg435显示的示例,那么闭包不起作用,因为根本没有闭包。如果你真的使用闭包,它工作的很好。实际上我遇到了一个闭包不工作的例子,我正在寻找一个通用的原因。简言之,闭包不能处理作为参数传递到更高范围然后缓存的变量。@user1514042:我看不出闭包不起作用的原因。如果您正在谈论thg435显示的示例,那么闭包不起作用,因为根本没有闭包。如果你真的使用close,它就可以正常工作。循环确实是交易的破坏者……你能在JS中克隆一个值吗?这在理论上可以解决这个问题,不是吗?@user1514042:为每个迭代创建一个值的副本就是使用闭包的目的。循环确实是破坏交易的因素……你能在JS中克隆一个值吗?这在理论上可以解决问题,不是吗?@user1514042:为每个迭代创建一个值的副本就是使用闭包的目的。