函数中的Javascript变量更改全局变量
我在计算范围和子句时遇到了一个很大的问题。我想要一个tmp变量,从中删除一个元素。但全局变量应该保持不变。这就是我的想法。这,函数中的Javascript变量更改全局变量,javascript,scope,clause,Javascript,Scope,Clause,我在计算范围和子句时遇到了一个很大的问题。我想要一个tmp变量,从中删除一个元素。但全局变量应该保持不变。这就是我的想法。这, var test = ['test', 'huhu']; function foo(bar) { var tmpTest = test; var index = tmpTest.indexOf(bar); if (index > -1) { tmpTest.splice(index, 1); } con
var test = ['test', 'huhu'];
function foo(bar) {
var tmpTest = test;
var index = tmpTest.indexOf(bar);
if (index > -1) {
tmpTest.splice(index, 1);
}
console.log(tmpTest);
}
foo('huhu');
console.log(test);
应该产生这个,
test
test, huhu
但却产生了这一点
test
test
我还试图使
var tmpTest=新数组(test)代码>但这会停止拼接工作。我想,当我设置tmpTest=test
时,tmpTest
就变成了对原始test
变量的引用?我怎样才能解决这个问题呢?数组是对象。JavaScript中的对象由引用操作。指定引用不涉及制作对象的副本;这只是参考资料的副本。因此,您的tmpTest
变量只是对同一对象的另一个引用
有一种制作阵列副本的简单方法:
var tmpTest = test.slice(0);
使用与原始数组相同的值构造新数组
可以使用一个或多个参数调用Array()
构造函数,但这些参数不会被解释为要复制的数组。如果使用一个数字参数调用它,则会将其解释为数组的初始.length
值。多个参数使用这些值创建新数组。数组是对象。JavaScript中的对象由引用操作。指定引用不涉及制作对象的副本;这只是参考资料的副本。因此,您的tmpTest
变量只是对同一对象的另一个引用
有一种制作阵列副本的简单方法:
var tmpTest = test.slice(0);
使用与原始数组相同的值构造新数组
可以使用一个或多个参数调用Array()
构造函数,但这些参数不会被解释为要复制的数组。如果使用一个数字参数调用它,则会将其解释为数组的初始.length
值。多个参数使用这些值创建一个新数组。对象(包括数组)使用其引用传递!所以tmpTest
和test
都引用了相同的数组(内存空间)!您必须使用另一种方式复制数组:var tmpTest=test.slice()代码>!FWIW,问题与作用域无关。对象(包括数组)是使用它们的引用传递的!所以tmpTest
和test
都引用了相同的数组(内存空间)!您必须使用另一种方式复制数组:var tmpTest=test.slice()代码>!FWIW,问题与范围无关。