閉包值得單獨說一說,但不值得長篇大論,有許多新手包括自己以前也是被這個玩意兒搞迷糊了。
[點我查看mdn的閉包](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures)

閉包的定義有很多,當理解后發現每種說法都正確,沒有理解的時候沒看每一種說法都很迷糊。
閉包,其實就**是**一個**函數**,能**訪問其他函數內部**作用域**變量**的函數。
* * * * *
(小白讀一遍肯定有點繞,梳理一下:閉包就是一個函數,一個什么樣的函數?能訪問到其他函數作用域的一個函數)
* * * * *
知乎上看到一個很有趣的說法
> 我的年齡是秘密,你想知道。
> 但是每次我都含糊其辭的對你說 undefined;
> 為了防止我自己也忘記或搞錯自己的年齡,我辦了一張身份證,上面記錄我的年齡信息,藏在我家里。
> 你知道了這件事,為了得到我的年齡,決定對我投其所好,
> 于是你送我一只逗比間諜貓。作為感謝我給了你一把我家的鑰匙,方便你有空來看貓。
> 這只貓實在太神奇了,每次都能找到我的身份證,并把信息傳遞給你。
> 于是你每次想知道我的年齡的時候就來看貓,
> 然后間諜貓每次都能把我的最新的年齡信息反饋給你。、
> 作者:閆俊虎
也有說法閉包,就是**帶數據的函數**,也說的很到位。
下面就是一個很典型的閉包

這樣可以有私有變量,外面是訪問不到a的,模塊化也是依靠這個特征。
下面這個是不是很熟悉

很多第三方褲都會這樣去使用閉包,包括流行了十多年的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)