在ECMAScript中,闭包中的返回的语句会将控制流返回给上下文(调用者)
闭包的作用
1.保护函数内的变量安全
2.在内存中继续一个变量
例子:
function fun1(){
var i = 0;
function fun2(){
alert(++i);
}
return fun2;
}
var c = fun1();
c();
闭包产生的原因:
1.fun2在fun1内嵌套
2.fun2作为fun1的返回值被fun1返回
1.当定义函数fun1的时候,js解析器会将函数fun1的作用域设置为定义fun1的fun1所在的环境,如果fun1是一个全局函数,则scope chain只有windows对象。
2.当函数fun1执行的时候,fun1会进入相应的执行环境(exeution context)
3.在创建执行环境的过程中,首先会从fun1添加scope属性,即fun1的作用域 fun1.scope=a的作用域(scope Chain)
4.执行环境会创建一个活动对象(call Object),活动对象也是一个拥有属性的对象,但是他不具有原型而且不能通过javascript代码直接访问。创建完活动对象后,把活动对象添加到fun1的作用域的最顶端,此时fun1的作用域包含fun1的活动对象和window对象。
5.在活动对象上添加一个arguments属性,他保存访问fun1的时所传递的参数。
6.最后把函数fun1所有的参数和内部的函数fun2的引用也添加到fun1的活动对象上,在这一步需要完成fun2的定义,所有函数fun2的作用域也添加到fun1的的定义环境即fun1的作用域