閉包

閉包

// 坑
function count() {
    var arr = [];
    for (var i=1; i<=3; i++) { // 這里可以使用 let 聲明 i 來避免坑
        arr.push(function () {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

// 調用
f1(); // 16
f2(); // 16
f3(); // 16

由于返回的函數引用了變量i,但它并非立刻執行。等到3個函數都返回時,它們所引用的變量i已經變成了4,因此最終結果為16。

填坑:

再創建一個函數,用該函數的參數綁定循環變量當前的值,無論該循環變量后續如何更改,已綁定到函數參數的值不變:

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) { 
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

注意:創建立即執行函數需要用括號括起來:(function (x) { return x * x }) (3);,否則會報語法錯誤。

巧用閉包將多參數函數變成單參數函數

function make_pow(n) {
    return function (x) {
        return Math.pow(x, n);
    }
}

// 創建兩個新函數:
var pow2 = make_pow(2);
var pow3 = make_pow(3);

pow2(5); // 25
pow3(7); // 343
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 86.復合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開。如果任何模式...
    無灃閱讀 1,429評論 1 5
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • 我有一個家 家里有個她 一畝三分地 有著我和她 陪她沐浴陽光 伴她數繁星 我和她 青梅竹馬 發芽,長高 開花,出嫁...
    西北女記憶閱讀 237評論 0 0
  • 2017年前,天水,對我來說,就像是個熟悉的陌生人。 小時候,在天水上了兩年學,有幾個一直聯系的天水同學。 小時候...
    問心淺笑閱讀 395評論 17 19