初步理解闭包

初步理解闭包

1.什么是闭包

借用MDN的定义

闭包是指这样的*作用域*,它包含有一个*函数*,这个函数可以调用被这个作用域所*封闭*的变量、函数或者闭包等内容。通常我们通过闭包所对应的函数来获得对闭包的访问。

2.闭包产生的背景

我们知道在js中 内部作用域能访问外部作用域,外部作用域不能访问内部作用域。

如果现在我有一个很重要的变量a=1(不能改,改了程序就崩溃,但是我部分时候需要全局调用),我不想让人误改。如果我使用全局变量,被人误改了=>game over 

如果我用局部变量,全局又不能调用,我该怎么办?

我们可以在a所在作用域里面加一层作用域,这样里层作用域能访问a,但是这样还不够,全局还是不能访问,我们还要在里层作用域里面将其暴露出来(类似的概念参考函数的setter. getter)

var b= function(){
		var a=1           //a非常重要
		var take =function(){        //添加take函数,里面的作用域相对b的作用域为内部作用域
		return a                    //内部作用域访问外层的参数, ***并暴露出来****
        }
return take()        // ***暴露并执行内层函数
}
 b()                     //输出1 即a的值       


3闭包作用

通过上面代码我们就创造了一个闭包 ,通过这个闭包 我们可以达到   窖藏?(隐藏但是是一种保护我们能随时获取)一个变量的目的

我们再看一个例子

function makeFunc() {
  var name = "Mozilla";
  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();
console.log(myFunc)
muFunc ()//输出Mozilla

一般我们执行完一个函数以后,局部活动对象会被销毁

但当我们执行完makeFunc() 以后name这个变量在内存中还是存在的      当makeFunc()函数执行完毕后,其执行环境的作用域链被销毁,但它的活动对象仍然会留在内存中
当myFunc()执行完的时候 实际上就是di spalyName执行完的时候 name此时才被销毁了



4闭包缺陷

闭包只能取得包含函数中任意变量的最后一个值, 比如循环i值只能取最后一个,解决途径就是立即执行函数的运用

5参考资料

高级程序设计

MDN闭包

阮一峰-闭包


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值