日期:2014-05-16  浏览次数:20331 次

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