创建对jQuery.data键的本地引用

创建对jQuery.data键的本地引用,jquery,reference,scope,Jquery,Reference,Scope,我正在jQuery.data()上做一些测试,我试图创建一个对某个数据键的本地引用,我希望它可以在本地更改,并且仍然影响“外部”。我认为使用一个示例会更好,因为我在JSFIDLE上发布了半长代码,而不是在这里: 我希望的结果是: {1: {length: 1}, total: 1} 但只有length属性受局部变量递增的影响: {1: {length: 1}, total: 0} 我该怎么办?我不想撒谎——那代码令人难以置信地困惑。您需要使用所有这些自执行函数的原因是什么?看起来(至少对这

我正在
jQuery.data()
上做一些测试,我试图创建一个对某个数据键的本地引用,我希望它可以在本地更改,并且仍然影响“外部”。我认为使用一个示例会更好,因为我在JSFIDLE上发布了半长代码,而不是在这里:

我希望的结果是:

{1: {length: 1}, total: 1}
但只有length属性受局部变量递增的影响:

{1: {length: 1}, total: 0}

我该怎么办?

我不想撒谎——那代码令人难以置信地困惑。您需要使用所有这些自执行函数的原因是什么?看起来(至少对这个外行来说)你可以用一种更直接的方式来实现你的目标

无论如何,我不确定这是否是您要寻找的答案,但我只是在
AddError
中停止了调试器,以便了解它的范围和可用内容。因此,要使其返回所需的输出,您只需执行以下操作:

但是考虑到上下文。。。我猜肯定还有更多的工作要做。

如果您在
.data()
中存储一个对象(或数组),那么您实际上是在存储对它的引用,因此如果您这样做:

var obj = { key: 'value' }
$(el).data('obj') = obj;
obj.key = 'new value';
$(el).data('obj')。键
也将是新值,因为它是同一个对象

但是,如果存储的值是普通类型(例如数字或字符串),则将存储其副本:

var n = 5;
$(el).data('obj') = n;
n++;

$(el).data('obj')
仍将为5。

我相信您看到的原因是局部变量与您试图影响的外部变量同名。如果我理解正确,您建议我将局部变量total改为total\u errors之类的其他变量,所以它的名称与$.data对象中的名称不同?如果是这样的话——我尝试了一下,但没有成功:是的,对于这样一个简单的目标来说,这是相当令人困惑的。这是因为我在一个有更多代码的应用程序中做这件事,所以我删除了所有不相关的代码。自动执行功能是让它工作的唯一方法:)如果您有一个更简单的解决方案,可以添加1:{length:0}键并创建局部变量,我很乐意听到它。我知道我可以用$(elem).data来做,但我想用$.data(elem)来做,性能差异应该很大(或者我读到:),我最近一直在用
$.data
来做我正在开发的插件,我想我要彻底抛弃它。也就是说,我认为主要的好处(除了方便性)是当您需要在应用程序的独立部分(例如,独立模块)之间持久化数据时。在给定的模块中,我看不到与仅使用您自己的存储机制(例如,对象数组)相比的任何好处,只要您有DOM元素本身以外的标识符。廉价黑客:在给定元素的情况下,将数组索引存储在元素的自定义属性中,查找时间为o(1)。。非常感谢。非常有启发性!
var n = 5;
$(el).data('obj') = n;
n++;