JavaScript 閉包

廖雪峰《JavaScript教程》 閉包
http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143449934543461c9d5dfeeb848f5b72bd012e1113d15000

以下兩例均為教程中示例的引申。
例一:

    var f1, a = [1, 2, 3, 4];

    function lazy_sum(arr) {
        return function() {
            return arr.reduce(function(x, y) {
                return x + y;
            });
        }
    }

    f1 = lazy_sum(a);
    alert(f1()); //10
    a[0] = 0;
    alert(f1()); //9, not 10

閉包就是攜帶(綁定)狀態(tài)的函數(shù)。這個例子中,return 的閉包函數(shù)體中引用了外部函數(shù)級變量arr,它攜帶的狀態(tài)就是arr 所映射的實體,對于可變變量,更新數(shù)組a中元素,引起實體變化,閉包運行結(jié)果隨之變化。

例二:

    function count1() {
        var arr = [];
        for (var i = 1; i <= 3; i ++) {
            arr.push(function () {
                return i * i;
            });
        }
        return arr;
    }
    var arr1 = count1();
    var f1 = arr1[0]
    alert(f1()) //16

    function count2() {
        var arr = [];
        for (let i = 1; i <= 3; i ++) {
            arr.push(function () {
                return i * i;
            });
        }
        return arr;
    }
    var arr2 = count2();
    var f2 = arr2[0]
    alert(f2()) //1

    function count3() {
        var arr = [];
        for (var i = 1; i <= 3; i ++) {
            arr.push((function (i) {
                return function () {
                    return i * i;
                }
            })(i));
        }
        return arr;
    }
    var arr3 = count3();
    var f3 = arr3[0];
    alert(f3()); //1

count1 中閉包綁定的i 是count1 的函數(shù)級變量。
count2 中閉包綁定的i 是塊級變量(let),每次塊結(jié)束這個變量就固定下來了。
count3 中閉包綁定的i 是閉包的上層函數(shù)的函數(shù)級變量,互不想干。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現(xiàn)。 一、變量...
    zouCode閱讀 1,358評論 0 13
  • 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略。 譯者...
    KX九五閱讀 324評論 0 1
  • 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略。 譯者...
    秦至閱讀 794評論 0 19
  • 目錄 1.執(zhí)行環(huán)境與作用域鏈 2. 立即執(zhí)行函數(shù) 3. 閉包知識點 3.1 什么是閉包 3.2 使用閉包的意義與注...
    犯迷糊的小羊閱讀 696評論 0 11
  • 對于JavaScript的學習來說,閉包這一塊一直是玄而又玄的東西,初學者很難掌握,我是學了大半年的JS,現(xiàn)在又回...
    韓寶億閱讀 1,140評論 6 33

友情鏈接更多精彩內(nèi)容