闭包

闭包是指有权访问另一个函数作用域变量的函数。
创建闭包的方式:在一个函数的内部创建另一个函数,这个函数有权访问包含函数的活动对象即全局对象。
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
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值