变量损失价值

时间:2017-10-26 00:01:02

标签: javascript

所以我在这里读到很多关于人们失去变量价值的问题,这与关闭有关。但我完全无法在这里发现问题。我试过for循环,而循环,都不起作用。

function parseArray(arrayIn) {
    var firstRow = arrayIn.shift();

    while ( arrayIn.length > 0 ) {
        addToTable(firstRow, arrayIn.shift());
    }
}

我也试过

function parseArray(arrayIn) {
    var firstRow = Object.assign([], arrayIn[0]);

    for ( var i=1; i<arrayIn.length; i++) {
        addToTable(firstRow, arrayIn[i]);
    }
}

无论哪种方式,addToTable都会被正确调用两次,而在第三次传递中,firstRow是一个空数组。我最初尝试发送arrayIn [0],它也在第三次传递时成为一个空数组。最奇怪的是,第二个值(arrayIn.shift()或arrayIn [i])是整个时间的正确值和期望值。

这可能很简单我只是缺少,但是,有人可以帮忙吗?我一直无法看到其他关于闭包的答案如何适用于这种情况。

3 个答案:

答案 0 :(得分:1)

  

如何解决这个问题,以便在每次调用addToTable()时firstRow始终相同? - Jesse Fogel

好吧,如果你根本无法改变方法addToTable()。这是我会尝试的:

function parseArray(arrayIn) {
    var firstRow = arrayIn.shift();

    while ( arrayIn.length > 0 ) {
        var copy = firstRow.slice();
        addToTable(copy, arrayIn.shift());
    }
}

这是按值(不是引用)复制数组的方法:如下所示:Copying array by value in JavaScript

答案 1 :(得分:0)

你应该从0开始循环而不是1:

function parseArray(arrayIn) {
    var firstRow = Object.assign([], arrayIn[0]);

    for ( var i=0; i<arrayIn.length; i++) {
        addToTable(firstRow, arrayIn[i]);
    }
}

答案 2 :(得分:0)

解决方案如下:不是使用Object.assign设置firstRow的值,而是使用Object.assign来调用addToTable() e.g。

function parseArray(arrayIn) {
    firstRow = arrayIn[0];

    for ( var i=1; i<arrayIn.length; i++ ) {
        addToTable(Object.assign([], firstRow), arrayIn[i]);
    }
}