做了一个简单测试验证js 闭包对资源占用情况,代码如下:
function justFN(){
var str = "1M string here";
window.setTimeout(function(){
debugger;//此处为断点
var s = str;//此处对str对象进行引用
},2000);
}
justFN();
然后分别在Firefox 和 IE9中运行,使用调试工具,当运行到断点时,查看闭包相关信息如下:
Firefox:
IE9:
之后修改代码,去掉回调函数中对str变量的引用,代码如下:
function justFN(){
var str = "1M string here";
window.setTimeout(function(){
debugger;
},2000);
}
justFN();
再次查看闭包相关信息如下:
Firefox:
IE9:
由此可以得出结论:
对于闭包的处理机制IE9 和Firefox是不一样的,差别在于:IE9中,无论上下文中的变量是否被闭包引用,都会被存储在闭包中,所占用的资源不会被释放,直到回调函数运行结束;而firefox中,只有被闭包引用的变量才会被存储在闭包中,也就是有选择性的存储变量,没有被引用的对象将会被自动回收(Chrome测试结果同Firefox)。
所以我们在使用异步操作进行函数回调时,一定要注意到IE9的这个特性,以减少不必要的内存占用。