函数中的Javascript变量更改全局变量

函数中的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

我在计算范围和子句时遇到了一个很大的问题。我想要一个tmp变量,从中删除一个元素。但全局变量应该保持不变。这就是我的想法。这,

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,问题与范围无关。