2012-04-16 35 views
-1

我构建了一个客户端数据集以发布到服务器。使用Add按钮的onClick事件,我收集表单数据并将其存储在内部数组中。这是一些人为/示例代码来试图证明这个问题(不幸的是,我无法分享源代码)。对象引用持久超越变量声明

var getDataFromForm = (function() { 
    var _internal = {}; /* Based on feedback, I think this is the reason for the behavior I'm experiencing */ 
    return function() { 
     var form = {}; 
     /* Get the form data */ 
     _internal.name = form.name; 
     _internal.id = form.id; 
     return _internal; 
    }; 
}()); 

var internal = { vals: [] }; 

function onClick() { 
    var newData = getDataFromForm(); 

    doAjaxValidation({ 
     success: function() { 
      internal.vals.push(newData); /* All values in array have been updated to this newData reference on click */ 
      internal.vals.push(JSON.parse(JSON.stringify(newData))); /* ugly, but the reference is broken and future clicks work as expected */ 
      internal.vals.push($.extend({}, newData)); /* reference to the object is still persisted through jQuery's extend */ 
     } 
    }); 

} 

我很困惑,为什么newData参考交给的newData每个按钮单击新任务。每个点击事件都是一个新的函数调用,并且newData(理论上)应该是一个新的对象,与任何其他按钮点击中的newData无关。

我错过了什么?

编辑:此示例来自一个更大的代码块,我试图将其减少到最简单的可能表达式。显然,这不是一个功能性的代码片段。

+1

我猜这个问题是在getDataFromForm ...你可以分享代码吗? – Prestaul 2012-04-16 19:37:57

+1

*“我错过了什么?”*不确定,但我们缺少的是代码,它显然会返回有关该对象的问题。仅供参考,对象本身从不复制到任务中。被复制的值是对该对象的引用。 – 2012-04-16 19:48:58

+0

为什么你放弃了自己的问题? – 2012-04-17 00:03:23

回答

1

听起来好像你传递一个对象,并期待一个副本。

在JavaScript中,对象本身从不复制到任务中。这是一个的值语言,但对于对象而言,复制的值是对该对象的引用。因此,从getDataFromForm返回newData将导致对每个onClick中同一对象的引用副本。

+0

太棒了!你有链接到JavaScript中变量声明/赋值的文档吗? – Christopher 2012-04-17 01:29:45

+0

@Christopher:对不起,但我没有任何专门处理这个问题的文档。有关一些常规信息,您可能需要查看https://developer.mozilla.org/en/JavaScript/Guide。它们确实包含特定于Mozilla的功能,但我认为它们通常将它们记录为这样。 – 2012-04-17 02:14:50

+1

没有问题。我们一直在通过引用/通过JavaScript中与价值相关的错误来解决问题。 http://objrefnotset.blogspot.com/2012/02/javascript-object-and-variable-scope.html。我很欣赏你的洞察力。 – Christopher 2012-04-17 02:27:25