今天看到一个朋友在群里问了一个问题,代码如下
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指向同一个堆内存地址。所以就有了以下解释: