Stan Blog

學習過程中的一些記錄

[JaveScript] 閉包 ( Closure )

  1. 閉包的觀念說明與操作

    觀念:
      函式中有另外一個函式
      函式用的資料(n)定義在外面的函式
      資料(n)會被留下來
    
    example:
    
    // 函式中的變數/參數,在函式程序結束後。資料會被回收
    function test(n) {
      console.log(n);
    }
    
    // Closure: 函式中的變數/參數,在函式程序結束後。[未來]還會被使用,[資料會被保留住]
    function test(n) {
      // 間隔 n 秒後,印出 n
      window.setTimeout(function(){
        console.log(n);
        //n=null; // 強迫瀏覽器回收資料 (早期作法)
      }, n*1000);
    }
    test(1);
    test(2);
    console.log("end");
    
  2. 使用閉包解決問題

        /*
          需求:
            1 秒鐘後印出 1
            2 秒鐘後印出 2
            3 秒鐘後印出 3
        */
    
        // 直覺寫法。但印出來的會是 4,不是預期的結果。迴圈不需等待(1秒內就結束)
        // for (var i=1; i<=3; i++) {
        //   window.setTimeout(function() {
        //     console.log(i);
        //   }, i*1000);
        // }
    
        // 解決方式: 使用閉包,函式結束。每次的 i 被保留。直到迴圈結束
        function print(n) {
          window.setTimeout(function() {
            console.log(n);
          }, n*1000);
        }
        for (var i=1; i<=3; i++) {
          print(i);
        }
    
  3. 使用 let 解決問題

        /*
          需求:
            1 秒鐘後印出 1
            2 秒鐘後印出 2
            3 秒鐘後印出 3
        */
        // let 和 var 宣告變數,差別在變數的 scope
        // var 的 scope 只套用在函式的區塊
        // let 的 scope 套用在任何大括號中,套用在任何程式區塊
        for (let i=1; i<=3; i++) {
          window.setTimeout(function() {
            console.log(i);
          }, i*1000);
        }
    


Ref:

Comments

comments powered by Disqus