函数按引用传参问题

今天看到一个朋友在群里问了一个问题,代码如下

var foo = {n:1};
(function(foo){            
    var foo;               
    console.log(foo.n);    // 1
    foo.n = 3;             
    foo = {n:2};           
    console.log(foo.n);    // 2
})(foo);
console.log(foo.n);  //3

很好奇为什么结果打印的是1 2 3。那在这里分析下,首先在函数外部定义的变量foo属于全局变量,此时在栈内存中给它分配一个物理地址,假如为x1,同时赋值时x1对应的变量foo指向堆中的对象{n:1},而在函数内部定义的变量foo属于局部变量,她会在内存中新开辟一个地方去存放,地址设为x2, 按理说这两个变量在栈中应该相互独立,互不干扰。但是由于foo是引用类型的,在函数中按引用类型传值就想当于x1和x2指向同一个堆内存地址。所以就有了以下解释:

猜你喜欢

转载自www.cnblogs.com/liruoruo/p/10148136.html