在那段代码中:
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按值而不是通过引用传递变量,所以一旦全局变量加载了本地变量的值,无论我对局部变量做了多少更改,全局变量都不应该除非我再次将局部变量的值赋给它...或者至少是我的想法!
任何人都可以解释为什么会这样吗?谢谢!
答案 0 :(得分:1)
这里的问题是javascript通过引用传递对象。
这行代码
window.g_a_PreEditData = aData;
不会创建对象的copy
并分配它。它改为分配参考。
换句话说,在此次通话后,window.g_a_PreEditData
和aData
指向同一个对象。
如果这不是您想要的,则必须克隆aData
。由于aData
是一个数组,因此您可以通过slice
方法执行此操作。
window.g_a_PreEditData = aData.slice();
如果aData
是一个对象,则必须以其他方式克隆它。有关在javascript中克隆对象的主题,请参阅this question。