JavaScript闭包一个小解答
function a(){
var i=0;
function b(){
alert(++i);//语法解析结果,函数名字b,函数参数列表为空,函数内容alert(++i),函数外部调用列表i。语法执行阶段,发现i不存在当前ScriptObject的函数参数,以及声明变量列表里面,与是就查看函数调用的外部变量列表,存在,保存i的值到闭包。第二次语法解析这个函数,ScriptObject表不重置。
}
return b;
}
var c = a();
c();
c();//第二次语法解析
c();//第三次语法解析
//没有引用,垃圾回收器开始回收b所在的闭包。
//JavaScript语言执行代码执行分两步骤,第一是语法解析,第二是语法执行。
//语法解析,是看看声明了哪些变量,对这些变量赋值undefined。会形成一个叫ScriptObject表,存储这些变量。ScriptObject的key,基本上是函数名字,函数参数列表,函数里面的内容,以及函数调用的外部变量列表。
//语法执行,该赋值就赋值。该调用就调用,一调用到外部变量列表时,就进行其引用次数计算。如果引用数量为0,闭包就释放了。
//记住闭包是ScriptObject的执行环境,ScriptObject的数据都存储在闭包。而ScriptObject只是对数据进行标记。
var i=0;
function b(){
alert(++i);//语法解析结果,函数名字b,函数参数列表为空,函数内容alert(++i),函数外部调用列表i。语法执行阶段,发现i不存在当前ScriptObject的函数参数,以及声明变量列表里面,与是就查看函数调用的外部变量列表,存在,保存i的值到闭包。第二次语法解析这个函数,ScriptObject表不重置。
}
return b;
}
var c = a();
c();
c();//第二次语法解析
c();//第三次语法解析
//没有引用,垃圾回收器开始回收b所在的闭包。
//JavaScript语言执行代码执行分两步骤,第一是语法解析,第二是语法执行。
//语法解析,是看看声明了哪些变量,对这些变量赋值undefined。会形成一个叫ScriptObject表,存储这些变量。ScriptObject的key,基本上是函数名字,函数参数列表,函数里面的内容,以及函数调用的外部变量列表。
//语法执行,该赋值就赋值。该调用就调用,一调用到外部变量列表时,就进行其引用次数计算。如果引用数量为0,闭包就释放了。
//记住闭包是ScriptObject的执行环境,ScriptObject的数据都存储在闭包。而ScriptObject只是对数据进行标记。
合乎自然而生生不息。。。