闭包和作用域

我大前端全靠JavaScript吃饭,而闭包和作用域也是JavaScript中的核心,其实在开发过程中我们经常用到闭包,常见到我们自己都不知道自己用了。

  • 啥是闭包?
  • 闭包和作用域有啥关系
  • 闭包的使用场景
  • 写一个闭包的实例

1 闭包的概念和原理真的不想说,有的详解看的很晕,牵涉到js语法和执行环境,执行机制等,所以不谈。

2 闭包和作用域肯定是会被同时谈到的,一个变量(自由变量)到底取哪个值取决于它所能用到的作用域。

请看下面这个例子:

上面的写法错误的原因是在点击的时候,i变量早就变成了10(或者你也可以这么理解:对dom的事件操作是属于异步的,所以不用说肯定这时候同步的任务早就结束了,i都更新到10且停止更新)

SO! 用闭包来保护我们的 i 变量吧,请看下面的写法:

上面的写法ok,原因在于把每一次的i变量当作参数传给 一个自调函数,而参数被当时的i赋值后存在于函数内部作用域,是受到保护的,

不管外面i 发生了什么也不会变。

扫描二维码关注公众号,回复: 6020229 查看本文章

3 闭包的一个实例

  场景:假如有这样一个需求,点击一个收藏图标(暂不考虑取消收藏逻辑),我们调用一个预先写好的函数,这个函数会判断某个用户是否已经点击了,如果没有点击就高亮收藏,如果点击过了就提示已经收藏。请看下面的代码。

 

上面实例中的定义的变量  _list 处在函数闭包中,属于私有变量,初衷是不希望它被随意的改变,只能通过用户点击时候的判断。

而 return 函数中使用到的 _list 是自由变量,它的值需要在本作用域查找,如果没有就去父级作用域查找。而这一系列查找就是 作用域链。

总结:闭包使得变量的权限收到保护和收敛,减少被污染的可能性。

猜你喜欢

转载自www.cnblogs.com/yangboy/p/10772099.html