为何前者形成闭包 后者没有
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();