-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

我错过了什么?

编辑:此示例来自更大的代码块,我试图将其简化为最简单的表达式。显然,按原样,这不是一段功能代码。

4

1 回答 1

1

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

在 JavaScript 中,对象本身永远不会被复制到赋值中。它是一种按值的语言,但在对象的情况下,复制的值是对对象的引用。因此,newData从返回getDataFromForm将导致在 each 中复制对同一对象的引用onClick

于 2012-04-17T01:26:28.007 回答