[JaveScript] 閉包 ( Closure )
閉包的觀念說明與操作
觀念: 函式中有另外一個函式 函式用的資料(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");
使用閉包解決問題
/* 需求: 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); }
使用 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); }