请先查看这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'和直接修改有什么不同?
答案 0 :(得分:2)
在代码块1和2中,您正在修改aa
。
在代码块3中,您重新绑定 aaa
到另一个数组,而函数aaa
中的t1
不是对外部{{1}的引用不再了。因此,外部aa
未被修改。
您可以参考Is JavaScript a pass-by-reference or pass-by-value language?查看有关Javascript的变量传递行为的详细说明。