JavaScript的对象引用

Demo.1

简单的Demo,猜猜结果是什么?

javascript-obj-reference
toobug的圈圈图
  1. 创建对象{test:1},并将该对象在内存的引用地址,传递给a变量,a变量的值是对象{test:1}的引用。
  2. 复制a的值给变量b,也就是,b也获得了对象{test:1}的引用。
  3. 对b.test重新赋值为2,由于b是{test:1}的引用,实则是{test:1}这个对象的test属性的值变更为2。

嗯,这个坑,估计一个不小心就会踩到。

Demo.2

嗯,别被惯性思维给坑了,这里的b变量,被赋值了两次,两次都是不同的对象。

Demo.3

嗯,通过这个Demo,你想到了什么?闭包?

javascript-closure

在一个函数体内,var变量声明的变量,其作用域只在该函数体内,对于函数体外而言,是不可见的(废话)。

在a()这个函数体内,另有一个函数b(),对内部变量i进行了自加操作(嗯,都在一个作用域下面,绝对合法的操作)。有趣的事来了,当函数a()结尾的时候,把函数b()的引用给return了出去。接着,一个外部变量FuncDemo获得了该引用,此时,有一份a()函数相关的数据,在内存中给实例化了,其内存地址,正是被FuncDemo给引用了。

第二次再执行FuncDemo()的时候,尼玛,a()函数里面的私有变量i,其生命周期,居然超出了a()的生命周期,给持久保存了下来!!

咋办,长久以往,8G内存都不够用啊?

这个时候, FuncDemo = undefined;  FuncDemo被重新赋值,其值成了undefined,不再是刚才那个被实例化对象的引用。嗯,刚才被实例化的对象,没有了外部引用之后,GC可以开始干活鸟。

再赋值一次,一个新的对象又被实例化了。

结语:

感谢好导师TooBug,基础讲解生动活泼。

这个对象引用,很早之前讲过一次,然后第二天就踩坑了。今天重温,依旧很有意思。谁Demo.1\Demo.2都答错了,请喝可乐吧。

闭包,网上各种版本,百家争鸣(这个无所谓啦)。一个作用域内部的函数,return并且被外部对象给引用之后,函数本身居然给实例化了,其内部私有变量也给持久性的保存了。除非引用断掉,否则GC都无法回收。