读书人

为何前者形成闭包 后者没有解决方案

发布时间: 2012-04-25 19:32:32 作者: rapoo

为何前者形成闭包 后者没有
var y = "global";
function constructFunction() {
var y = "local";
function A(){
return y;
}
return A;
}
alert(constructFunction()()); // 结果为local

==================================================
var y = "global";
function constructFunction() {
var y = "local";
return new Function("return y");
}
alert(constructFunction()()); // 输出 "global"

======================
为何前者形成了闭包,后者没有?


[解决办法]
JavaScript的解释器在每次开始执行一个函数时,都会为该函数创建一个执行环境, 运行不属于任何函数的JavaScript代码的环境使用的是全局对象。 这个环境一个重要的部分就是定义变量的对象。当一个函数被调用时,就会为他创建 一个调用对象并放置在作用域链中。当该函数退出的时候,调用对象会从作用域链中 移除,所以也就没有对他的引用,所以JavaScript的垃圾回收机制会把它所占的内存 释放掉。下一次调用该函数数时又重复以上步骤,所以普通函数的调用对象的值并不 会在内存中保存,每一次调用都重新定义。如下例子:

JScript code
                function a(){  var o = 0;  return o;}e = a(); 

读书人网 >JavaScript

热点推荐