Javascript全局变量在不应';T

Javascript全局变量在不应';T,javascript,variables,reference,global,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( EditButt

在该法典中:

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_b_editEnable=false;
window.g_a_PreEditData='hello';
功能编辑行(编辑按钮){
如果(!window.g_b_editEnable){
window.g_b_editEnable=true;
var a_i_Pos=a_o_table.fnGetPosition(EditButton.parentNode);
aData=a_o_table.fngedata(a_i_Pos[0]);
console.log(window.g_a_PreEditData);
window.g_a_PreEditData=aData;
console.log(window.g_a_PreEditData);
数据[0]=“保存重置”;
for(count=1;count
我尝试使用一个全局变量(window.g_a_PreEditData)来存储一个值,这样就可以将它传递给另一个函数

但在函数中,我把局部变量的值保存在全局变量中,然后更新局部变量,但我不知道为什么全局变量在局部变量更新的同时更新

控制台日志如下所示: Hello(初始化时给出的值) 值1(局部变量的值) 值2(局部变量更新后的值)

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

当然,如果我声明一个新变量并将修改存储在那里(例如,一个名为“aNewData”的数组),并且我在该变量中存储更新的值,那么由于aData没有被修改,因此它工作正常,全局变量window.g_a_PreEditData也不会被更新,但是。。。为什么会发生这种情况?我认为javascript是通过值而不是引用来传递变量的,因此,一旦全局变量加载了局部变量的值,无论我对局部变量做了多少更改,全局变量都不会受到影响,除非我再次将局部变量的值赋给它。。。至少我是这么想的


谁能解释一下为什么会发生这种情况?谢谢

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

这行代码

window.g_a_PreEditData = aData;
不创建对象的
副本并分配它。而是指定一个引用

换句话说,在这个调用之后,
window.g_a_PreEditData
aData
指向同一个对象

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

window.g_a_PreEditData = aData.slice();


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

函数中唯一的局部变量是
a_i_Pos
@Dr.Molle是的,很抱歉这个不精确性(我是javascript新手,我认为在函数中声明一个变量会使它成为本地变量)。谢谢你的帮助+1,虽然他似乎只需要克隆一个数组,而不是一个完整的对象-
。slice()
就足够了。@Bergi-你说得对极了。我已经相应地更新了我的答案。非常感谢!我解决了声明一个新变量并将修改存储在那里的问题,但我仍然想知道,如果(正如我所想的)所有内容都按值传递,为什么它会更新。因此,对象不是通过值传递的,而是通过引用传递的,这解释了为什么它更新了全局对象。非常感谢你的帮助!