更改node.js的外部参数var

时间:2012-01-31 09:54:18

标签: node.js

请先查看这3个代码块。

代码区块1:

var t1 = function(aaa) {
        setTimeout(function(){
        a = 'bb';
        aaa.push(a);
    }, 1000);

}

var t3 = function() {
    var aa = new Array;
    aa[0] = 'aa';

    console.log(aa);
    t1(aa);

    setTimeout(function(){
        console.log(aa);
    }, 3000);
}

t3();

输出: ['aa'] ['aa','bb']


代码区块2:

var t1 = function(aaa) {
        setTimeout(function(){
        aaa[1] = 'bb';
    }, 1000);

}

var t3 = function() {
    var aa = new Array;
    aa[0] = 'aa';

    console.log(aa);
    t1(aa);

    setTimeout(function(){
        console.log(aa);
    }, 3000);
}

t3();

输出: ['aa'] ['aa','bb']


代码区块3:

var t1 = function(aaa) {
        setTimeout(function(){
        aaa = aaa.concat('bb');
    }, 1000);

}

var t3 = function() {
    var aa = new Array;
    aa[0] = 'aa';

    console.log(aa);
    t1(aa);

    setTimeout(function(){
        console.log(aa);
    }, 3000);
}

t3();

输出: ['aa'] ['aa']


问题是代码块3,'concat'方法无法通过参数修改'aaa'var pass。
'concat','push'和直接修改有什么不同?

1 个答案:

答案 0 :(得分:2)

在代码块1和2中,您正在修改aa

的内容

在代码块3中,您重新绑定 aaa到另一个数组,而函数aaa中的t1不是对外部{{1}的引用不再了。因此,外部aa未被修改。

您可以参考Is JavaScript a pass-by-reference or pass-by-value language?查看有关Javascript的变量传递行为的详细说明。