无法理解JS函数

时间:2016-09-08 16:02:48

标签: javascript jquery node.js bluebird

这是我的以下代码块。我将val对象从函数test1传递到test2并在test2中修改其值并将其发回。

var Promise = require("bluebird");
var list = [1,2,3];

var test1 = function(test) {
    return new Promise(function(resolve,reject) {
        var val = {"name" : "my_name","age" : 25};
        for (var item in list) {
            (function (item) {
                console.log("val",val);
                test2(val)
                    .then(function(test2Response) {
                        console.log("test2Response",test2Response)
                    });
            })(item)
        }
    });
};


var test2 = function(val1) {
    return new Promise(function(resolve,reject) {
        console.log("val1",val1)
        val1.name = val1.name + "_1"
        resolve(val1)
    })
}


test1()

这是我在不同阶段的变量valval1的价值。

val { name: 'my_name', age: 25 }
val1 { name: 'my_name', age: 25 }


val { name: 'my_name_1', age: 25 }
val1 { name: 'my_name_1', age: 25 }


val { name: 'my_name_1_1', age: 25 }
val1 { name: 'my_name_1_1', age: 25 }


test2Response { name: 'my_name_1_1_1', age: 25 }
test2Response { name: 'my_name_1_1_1', age: 25 }
test2Response { name: 'my_name_1_1_1', age: 25 }

我无法理解为什么每次迭代都会更改val的值,即使我只更新val1而不是val。如何保持val完好无损并仅修改' val1`?

1 个答案:

答案 0 :(得分:0)

当你将test2传递给val1时,它仍然是内存中的相同引用。您需要在传递给test2之前克隆该值,这可以通过这样做来轻松完成,然后再调用test2

var copyOfVal = Object.assign({}, val) // this just creates a new object using the same contents of val but different references in memory. 

然后将copyOfVal传递给test2,您将获得单独的结果。