1 回答

TA贡献1820条经验 获得超10个赞
首先一个变量能够一直停留在内存中的条件是什么?
能够被外部引用,而且是一直引用
这种引用不限于直接引用,还包括间接引用以及循环引用
接下来你需要了解一定的JS内存结构的知识了
先分析函数
var a = (function() {
var i = 0;
function fn() {
alert(i++);
}
return {
fa: function() {
fn();
}
}
}());
a.fa();// 0
a.fa();// 1
其实这个闭包有好多化蛇添足的地方,这个后面再说
第一:这是一个立即执行/自调用的函数
(function(){}())
并将该函数的返回值赋值给全局变量a
第二:看看这个函数执行之后做了什么
创建内部变量i(对外不可见);
创建内部变量fn(对外不可见);
创建对象
{fa: function(){fn()}}
==={fa: fn}
并作为返回值返回给全局变量a;第三:执行阶段
调用
a.fa
函数,本质上调用了fn
函数,也就是外部持有fn
函数的一个副本,内部变量fn
没有随着函数的执行结束消亡,常驻内存fn
函数的执行会alert(i++)
其实,即使不对i进行任何操作,fn
依然持有内部变量i
的一个副本,内部变量i
没有随着函数的执行结束消亡,常驻内存结论: 这里是比较典型的间接引用
i
,fn
的例子通过未命名的返回对象扩展:
var a = (function() {
var i = 0;
function fn() {
alert(i++);
}
return fn;
}());
a();// 0
a();// 1
这个直接引用了fn
间接引用了i
添加回答
举报