var a = [1, 2, 3, 4];
function set(a) {
a = [5, 6, 7, 8];
}
set(a);
console.log(a); // 最终打印 [1, 2, 3, 4]
对于set函数,其参数a应为引用地址的拷贝。对于a=[5, 6, 7, 8]这条语句,其是会将a作为局部变量重新开辟地址来保存[5, 6, 7, 8],最后函数执行完后进行销毁,导致最终打印结果为[1, 2, 3, 4]。 还是由于其他原因,请大佬们指教。
var a = [1, 2, 3, 4];
function set(a) {
a = [5, 6, 7, 8];
}
set(a);
console.log(a); // 最终打印 [1, 2, 3, 4]
对于set函数,其参数a应为引用地址的拷贝。对于a=[5, 6, 7, 8]这条语句,其是会将a作为局部变量重新开辟地址来保存[5, 6, 7, 8],最后函数执行完后进行销毁,导致最终打印结果为[1, 2, 3, 4]。 还是由于其他原因,请大佬们指教。
你需要明白以下几点
1. 声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的。var MDN
var a = 123;
function set() {
a = 1; // 在严格模式(strict mode)下会抛出 ReferenceError 异常
}
set();
// 相当于执行了 var a = 1;
// 注意:这里没有参数
console.log(a); // 打印 "1"
2.原始参数被作为值传递给函数;值被传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。
var a = [1, 2, 3];
function set(a) {
a = [4, 5, 6]
}
set(a);
console.log(a); // 打印 [1, 2, 3]
3.如果你传递一个对象(即一个非原始值,例如Array或用户自定义的对象)作为参数,而函数改变了这个对象的属性!!!
,这样的改变对函数外部是可见的
/**----------------Object-----------------------*/
var a = {name: 'tom'};
function set(a) {
a.name = 'Honda';
}
set(a);
console.log(a); // 打印 { name: 'Honda' } name属性改变
/**----------------Array-----------------------*/
var a = [1, 2, 3]
function set(a) {
a[0] = 4;
}
set(a);
console.log(a); // 打印 [ 4, 2, 3 ]
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
外层a指向1234的地址,传进函数传的是这个引用地址,函数内部的a是属于函数内部的一个变量,它也指向1234的地址,跟外层a没关系,只是同名而已,修改函数的a修改的是指向,如果你了解c语言,这其实就是指针的概念