闭包是指有权访问另一个函数作用域变量的函数。
创建闭包的方式:在一个函数的内部创建另一个函数,这个函数有权访问包含函数的活动对象即全局对象。
闭包与变量
创建闭包的方式:在一个函数的内部创建另一个函数,这个函数有权访问包含函数的活动对象即全局对象。
function closure(){ //执行clsure创建一个包含arguments和person活动对象。返回一个匿名函数
var person={name:1};
return function(age){
person.age=age;
return person;
}
} //创建了一个闭包
var closure1=closure(1) //返回匿名函数,closure函数执行环境的对象被销毁,局部对象只在执行过程中存在。
var person1=closure1(22) //返回closure的person对象,
person1.name //1
在创建closure的时候会预先创建一个包含全局变量的作用域链(所有对象都是引用),把该作用域保存在一个scope的属性中,当执行该函数时,会为
函数创建一个执行环境,然后复制scope属性中的对象构起执行环境作用域链。然后一个活动对象被推入执行环境作用域前端。closure的作用域包含两个
变量对象,本地变量对象person 全局对象。作用域就是一个指针。只是引用。
匿名函数会将closure函数的活动对象添加到它的作用域链。closure执行完成它作用域链变销毁,但是它的活动对象不会被销毁,因为匿名函数作用域链还在引用
这个活动对象,它的活动对象会保存在内存中,执到匿名函数被销毁。
var closure=null //解除匿名函数引用,释放内存。 匿名函数有3个作用域链,本地,包含函数,全局
闭包与变量
闭包只能取得包含函数中任何变量的最后一个值,就包含函数执行完后的变量,匿名函数只能取得包含函数执行完后的变量。
function createFunctions(){
var person=new Array();
for(var i=0;i<10;i++){
person[i]=function(){
return i;
}
}
return person
}
var person1=createFunctions();
person1[1]() //10 10而不是1,是因为闭包保存包含块变量最后一个值,除非每执行一次for调用一次匿名函数,在为匿名函数添加一个匿名函数。
function createFunctions(){
var person=new Array();
for(var i=0;i<10;i++){
person[i]=function(num){
return function(){
return num;
}
}(i); //每次for循环就调用第一个匿名函数,num复制i值,参数传递基本类型值时,被传递的值会复制给一个局部变量(即命名参数,或arguments中的一个元素)
匿名函数创建一个访问num的闭包即匿名函数包含的匿名函数。
}
return person
}