闭包值得单独说一说,但不值得长篇大论,有许多新手包括自己以前也是被这个玩意儿搞迷糊了。
[点我查看mdn的闭包](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures)
![](https://box.kancloud.cn/402da9ceec3b8260b3b8bee91a0665d5_43x56.png)
闭包的定义有很多,当理解后发现每种说法都正确,没有理解的时候没看每一种说法都很迷糊。
闭包,其实就**是**一个**函数**,能**访问其他函数内部**作用域**变量**的函数。
* * * * *
(小白读一遍肯定有点绕,梳理一下:闭包就是一个函数,一个什么样的函数?能访问到其他函数作用域的一个函数)
* * * * *
知乎上看到一个很有趣的说法
> 我的年龄是秘密,你想知道。
> 但是每次我都含糊其辞的对你说 undefined;
> 为了防止我自己也忘记或搞错自己的年龄,我办了一张身份证,上面记录我的年龄信息,藏在我家里。
> 你知道了这件事,为了得到我的年龄,决定对我投其所好,
> 于是你送我一只逗比间谍猫。作为感谢我给了你一把我家的钥匙,方便你有空来看猫。
> 这只猫实在太神奇了,每次都能找到我的身份证,并把信息传递给你。
> 于是你每次想知道我的年龄的时候就来看猫,
> 然后间谍猫每次都能把我的最新的年龄信息反馈给你。、
> 作者:闫俊虎
也有说法闭包,就是**带数据的函数**,也说的很到位。
下面就是一个很典型的闭包
![](https://box.kancloud.cn/340714d0f868b0ed93e5bebaadc3e3e6_254x332.png)
这样可以有私有变量,外面是访问不到a的,模块化也是依靠这个特征。
下面这个是不是很熟悉
![](https://box.kancloud.cn/393a6bbd483596fc7938122cefb87129_558x353.png)
很多第三方裤都会这样去使用闭包,包括流行了十多年的jquery框架也很多地方使用这种。
小练习
~~~
/*
* 题目:
*创建一个工厂函数 createPerson,需要完成以下要求:
* 1.保存传入参数 name 到一个私有变量中
* 2.函数返回一个对象,且对象带有一个方法 getName,用于返回对象的私有变量 name 的值
*/
function createPerson(name) {
var pvName =name;
return {
getName:function(){
return pvName;
}
}
}
~~~
- 以专业工程师的标准要求自己
- JS
- 函数的this
- 函数的argument
- 函数的apply、bind、call方法
- 创建对象
- 构造函数创建对象
- 原型结合构造函数创建对象
- 原型
- 继承
- 闭包
- 正则表达式
- Ajax
- 设计模式
- ES6
- es6的模块化
- 定义变量的新方式
- 函数扩展
- 数组扩展
- 性能与工程化
- 关于http与缓存
- 重排(reflow、layout)与重绘
- 页面性能
- gulp
- webpack
- 一些项目回顾总结
- 移动端&微信H5游戏
- 微信小程序
- Vue.js
- 随手记录
- 如何通过前端技能获取2018世界杯门票
- jsonp
- es6 javascript对象方法Object.assign()
- 一份不错的基础面试题
- vscode常用插件
- koroFileHeader
- 构建自己的Js工具库
- H5 game
- Phaser从入坑到放弃再入坑
- 1.游戏的创建
- 2.资源的加载
- 3.phaser中的舞台,世界和摄像机
- 4.游戏缩放控制,移动端的适配
- 5.phaser中的显示对象
- 1.概述
- 2.phaser中的图片,图形,和按钮
- 3.phaser中的精灵
- 4.文字
- 5.组
- 6.phaser中的动画
- 7.粒子和瓦片地图
- 8.瓦片地图
- lodash
- ES5 to ESNext — here’s every feature added to JavaScript since 2015
- 防抖(debounce) 和 节流(throttling)