> For the complete documentation index, see [llms.txt](https://jen-hsuan-hsieh.gitbook.io/javascript-node-js/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jen-hsuan-hsieh.gitbook.io/javascript-node-js/chapter1/11bi-ji/16closure.md).

# 1.7.Closure

* Closure(閉包)的功能為
  * 1.延長變數的生存週期
  * 2.可將全域變數封裝為區域變數
  * 3.利用閉包進行物件導向設計
* 1.延長變數的生存週期
  * 變數的生存週期
    * 全域變數: 生存時間為永久
    * 區域變數: 隨函數呼叫而銷毀
  * Closure的作用下, 可使**區域變數不會隨函數的銷毀而繼續生存下去**

    ![](https://3195929128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8GO2MkGtHfarAf%2F-M4M0IHoyFvfGKjf7P-T%2F-M4M0MGdGr7uUiSzb15k%2F1.jpg?generation=1586302920553080\&alt=media)

    * <http://codepen.io/JenHsuan/pen/zZWWjj?editors=1012>
* 2.將全域變數封裝為區域變數, 例如cache
  * 將不需要暴露在全域的變數封裝為區域變數
  * 寫法
    * 原來的code:

      ```
        var cache = {} // 全域變數
        var mult = function(){
            return something
        }
      ```
    * 改為

      ```
       var mult = function(){
           var cache = {} // 封裝全域變數
           return function(){
                return something
           }
       }
      ```

      ![](https://3195929128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8GO2MkGtHfarAf%2F-M4M0IHoyFvfGKjf7P-T%2F-M4M0MGfBWQFG6bkwkwL%2F2.jpg?generation=1586302920468788\&alt=media)

      * <http://codepen.io/pen/?editors=0012>
* 3.利用閉包進行物件導向設計
  * 有三種方式
    * 1.用建構子方式新增物件, 以closure的方式建立方法

      ![](https://3195929128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8GO2MkGtHfarAf%2F-M4M0IHoyFvfGKjf7P-T%2F-M4M0MGhX12mEHXB45rU%2F12.jpg?generation=1586302920491152\&alt=media)
    * 2.用JSON物件方式新增物件, 以closure的方式建立方法

      ![](https://3195929128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8GO2MkGtHfarAf%2F-M4M0IHoyFvfGKjf7P-T%2F-M4M0MGjDD9uoku9aET5%2F13.jpg?generation=1586302920419245\&alt=media)
    * 3.用建構子方式新增物件, 以closure的方式建立方法

      ![](https://3195929128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8GO2MkGtHfarAf%2F-M4M0IHoyFvfGKjf7P-T%2F-M4M0MGljHleu_Jihvlx%2F14.jpg?generation=1586302920415314\&alt=media)
* <http://codepen.io/JenHsuan/pen/VpXGxa?editors=0012>
