# 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](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](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](http://codepen.io/JenHsuan/pen/VpXGxa?editors=0012)
