请先看这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-by-参数
"concat"、"push"和直接修改有什么区别?
在代码块1和2中,您正在修改aa
的内容。
在代码块3中,您正在将aaa
重新绑定到另一个数组,并且函数t1
中的aaa
不再是对外部aa
的引用。因此,外部aa
没有被修改。
您可以参考JavaScript是一种通过引用的语言还是通过值的语言?查看有关Javascript变量传递行为的详细说明。