关于Javascript函数值传递的问题

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.3k
2 个回答


外层a指向1234的地址,传进函数传的是这个引用地址,函数内部的a是属于函数内部的一个变量,它也指向1234的地址,跟外层a没关系,只是同名而已,修改函数的a修改的是指向,如果你了解c语言,这其实就是指针的概念

你需要明白以下几点
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 ]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题