[圖解JS閉包](https://zhuanlan.zhihu.com/p/27857268)
[閉包 mdn](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures)
[閉包詳解一](https://juejin.im/post/5b081f8d6fb9a07a9b3664b6)
[閉包詳解二:JavaScript中的高階函數](https://juejin.im/post/5b167b476fb9a01e5b10f19b)
# 什么是閉包
《JavaScript高級程序設計》這樣描述:
```
閉包是指有權訪問另一個函數作用域中的變量的函數;
```
《JavaScript權威指南》這樣描述:
```
從技術的角度講,所有的JavaScript函數都是閉包:它們都是對象,它們都關聯到作用域鏈。
```
《你不知道的JavaScript》這樣描述:
```
當函數可以記住并訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行。
```
```
function fn1() {
var name = 'iceman';
function fn2() {
console.log(name);
}
return fn2;
}
var fn3 = fn1();
fn3();
```
這樣就清晰地展示了閉包:
1. fn2的詞法作用域能訪問fn1的作用域
2. 將fn2當做一個值返回
3. fn1執行后,將fn2的引用賦值給fn3
4. 執行fn3,輸出了變量name
我們知道通過引用的關系,fn3就是fn2函數本身。執行fn3能正常輸出name,這不就是fn2能記住并訪問它所在的詞法作用域,而且fn2函數的運行還是在當前詞法作用域之外了。
# 閉包優缺點
優點:
1. 因為在閉包內部保持了對外部活動對象的訪問,但外部的變量卻無法直接訪問內部,避免了全局污染;
2. 可以當做私有成員,彌補了因js語法帶來的面向對象編程的不足;
3. 可以長久的在內存中保存一個自己想要保存的變量.
缺點:
1. 可能導致內存占用過多,因為閉包攜帶了自身的函數作用域
2. 閉包只能取得外部包含函數中得最后一個值
- 筆記內容來源
- 你不知道的JavaScript上
- vue
- 環境搭建
- node和npm安裝配置
- 安裝vue-cli并初始化vue項目
- 安裝配置elementUI
- vuex安裝配置
- axios安裝配置
- main.js
- vue基礎入門
- vue-router介紹
- vuex
- vue 原理學習源碼學習
- js正則處理v-bind和語法
- 雙向綁定
- 虛擬dom
- mvvm和render函數
- vue工作項目筆記
- elementUI 表格分頁多選記憶功能
- elementUI表格展開一行
- keepAlive
- vue整合ckeditor5
- this.$router.push 內打開新窗口
- java修改上傳圖片的權限
- 兼容ie11
- 生成二維碼
- base64圖片下載(兼容IE10)
- vue新手引導程序intro.js
- vue插件 devtools
- vue刷新當前頁面
- vue 錨點導航
- axios
- axios與springmvc
- vue-cli 3搭建vue
- git
- git常用命令
- 正則表達式
- 實例demo
- 1
- 新手引導頁
- 純css3從左顯示下劃線動畫導航菜單
- 純css3從中間顯示下劃線動畫導航菜單
- css顯示密碼
- 倒計時時鐘
- 星星評分
- 按鈕懸停效果
- 步驟條
- css動畫按鈕
- input標題獲得焦點上移
- css圖片放大
- css鏡像導航欄
- js
- 通信
- for in 和 for of
- 前端安全問題
- Promise
- 掘金冴羽學習筆記
- 模擬call
- 模擬bind
- 閉包
- 1 作用域
- 2 執行上下文棧
- 3 變量對象
- 4 作用域鏈
- 5 this
- 面向對象
- 基礎知識點
- 渲染機制
- 其他
- 判斷是否為數組
- http
- css
- 基礎知識
- css陰影