为函数内的现有数组(全局变量)分配新值并不起作用。为什么?

时间:2016-02-22 21:33:12

标签: javascript arrays function

var array1 = [1, 2, 3, 4, 5];

//下面的函数1为数组分配一个全新的值,不起作用

function changeArray(array) {
  array = ["A", "B", "C"];
};

//功能2,它只是修改数组中的一个元素,确实有效

function addArray(array) {
  array.push(6);
}

** //如果我在array1上运行第一个函数(changeArray)然后尝试打印array1,它将保持不变。但是,运行函数2(addArray)确实添加了另一个元素" 6"进入阵列。我错过了什么?

2 个答案:

答案 0 :(得分:4)

您正在为标识为“array”的上下文命名空间位置分配新值。您应该将呼叫视为:

class A {
    private SerialPort serialPort;

    [MethodImpl(MethodImplOptions.Synchronized)] // <-- Is this necessary?
    public int Prop { get; set; }

    public A(SerialPort sp){
        serialPort = sp;
        serialPort.DataReceived += (Object sender, SerialDataReceivedEventArgs e) => {
            Prop++;
        };
    }

}

我希望很明显这不会取代原始参数,但你仍然可以修改数组,因为那不是一个赋值。如果你真的想通过函数进行赋值,你应该使用它的返回值或闭包。

function changeArray() {
    var thisNamespace = {}; // Not a real variable
    thisNamespace["array"] = arguments[0];
    // ...
    thisNamespace["array"] = ["A", "B", "C"];
}

或者:

function foo(bar) {
    return ["A", "B"];
}
var x = ["C"];
x = foo(x);

答案 1 :(得分:3)

您必须在函数内按名称调用原始数组。原始数组是一个全局变量,因此您无需将其作为参数传递。

var array1 = [1, 2, 3, 4, 5];
console.log(array1);
changeArray();
console.log(array1);

function changeArray() {
    array1 = ["A", "B", "C"];
};