var checker ; function myFunc(){ if(checker){ checker(); } alert("do myFunc:"+str);//alert_A var str = "test."; if(!checker){ checker = function(){ alert("do Check:"+str);//alert_B } } //装函数实例自身的一个引用返回 alert(this == myFunc.callee); return this; } myFunc()(); //输出: //1. do myFunc: undefined -->由alert_A输出,因为str使用后定义,所为结果:undefined //2. do myFunc: test. -->由alert_B输出,str是由第一个方法调用产生的闭包数据 //3. do myFunc: undefined -->由alert_A输出。
A.JavaScript中函数实例可能拥有多个闭包。
B.实例与闭包的生存周期是分别管理的。
C.函数被调用时总是初始化一个闭包,该闭包是否被销毁,取决于它是否有被(其它闭包)引用的变量/数据(如上面:str)。
函数执行时创建闭包>>执行中闭包没有被其它对象引用>>函数执行结束闭包被销毁。