Javascript全局变量在不应该更新时更新

时间:2014-05-06 10:25:21

标签: javascript variables reference global

在那段代码中:

window.g_b_editEnable = false;
window.g_a_PreEditData = 'hello';

 function EditRow(EditButton){
       if(!window.g_b_editEnable){
                 window.g_b_editEnable = true;
                 var a_i_Pos = a_o_table.fnGetPosition( EditButton.parentNode );                        
                 aData = a_o_table.fnGetData( a_i_Pos[0] );
                 console.log(window.g_a_PreEditData);
                 window.g_a_PreEditData = aData;
                 console.log(window.g_a_PreEditData);
                 aData[0] = '<button type=submit name=save>Save</button><button onclick=ResetTableFields(this) name=reset>Reset</button>';
                 for(count = 1; count < aData.length; count++){
                   aData[count] = '<input type=text value='+aData[count]+'></input>';
                 }
                 a_o_table.fnUpdate( aData, a_i_Pos[0], undefined, false, false);
                 console.log(window.g_a_PreEditData);
          }else{
                 return 1;
          }
  }

我尝试使用全局变量(window.g_a_PreEditData)来存储一个值,然后将其传递给另一个函数。

但是碰巧在函数中你看到我将局部变量的值保存在全局变量中,然后我更新局部变量,但我不知道为什么全局变量同时更新本地变量变量得到更新。

控制台日志如下: 你好(初始化时给出的值) Value1(局部变量的值) Value2(更新后的局部变量的值)

当我想要的是: 你好 值1 值1

当然,如果我声明一个新变量并将修改存储在那里(例如一个名为'aNewData'的数组),并且它存储在我存储更新值的变量中,那么因为aData未被修改,所以它工作正常全局变量window.g_a_PreEditData也没有更新,但是......为什么会这样?我认为javascript按值而不是通过引用传递变量,所以一旦全局变量加载了本地变量的值,无论我对局部变量做了多少更改,全局变量都不应该除非我再次将局部变量的值赋给它...或者至少是我的想法!

任何人都可以解释为什么会这样吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是javascript通过引用传递对象。

这行代码

window.g_a_PreEditData = aData;

不会创建对象的copy并分配它。它改为分配参考。

换句话说,在此次通话后,window.g_a_PreEditDataaData指向同一个对象。

如果这不是您想要的,则必须克隆aData。由于aData是一个数组,因此您可以通过slice方法执行此操作。

window.g_a_PreEditData = aData.slice();

如果aData是一个对象,则必须以其他方式克隆它。有关在javascript中克隆对象的主题,请参阅this question