var a = {test:1};
var b = a;
b.test = 2;
console.log(a.test);
简单的Demo,猜猜结果是什么?
toobug的圈圈图
嗯,这个坑,估计一个不小心就会踩到。
var a = {test: 1};
var b = a;
b = {test: 2};
console.log(a.test)
嗯,别被惯性思维给坑了,这里的b变量,被赋值了两次,两次都是不同的对象。
function a(){
var i = 0;
function b(){
i++;
console.log(i);
}
return b;
}
console.log(i); // 显示 ReferenceError: i is not defined
var FuncDemo = a();
FuncDemo();
FuncDemo();
FuncDemo = undefined;
FuncDemo = a();
FuncDemo();
嗯,通过这个Demo,你想到了什么?闭包?
在一个函数体内,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都无法回收。