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

闭包就是携带(绑定)状态的函数。这个例子中,return 的闭包函数体中引用了外部函数级变量arr,它携带的状态就是arr 所映射的实体,对于可变变量,更新数组a中元素,引起实体变化,闭包运行结果随之变化。

例二:

    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 的函数级变量。
count2 中闭包绑定的i 是块级变量(let),每次块结束这个变量就固定下来了。
count3 中闭包绑定的i 是闭包的上层函数的函数级变量,互不想干。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zouCode阅读 1,357评论 0 13
  • 前言 总括 :这篇文章使用有效的javascript代码向程序员们解释了闭包,大牛和功能型程序员请自行忽略。 译者...
    KX九五阅读 322评论 0 1
  • 前言 总括 :这篇文章使用有效的javascript代码向程序员们解释了闭包,大牛和功能型程序员请自行忽略。 译者...
    秦至阅读 792评论 0 19
  • 目录 1.执行环境与作用域链 2. 立即执行函数 3. 闭包知识点 3.1 什么是闭包 3.2 使用闭包的意义与注...
    犯迷糊的小羊阅读 694评论 0 11
  • 对于JavaScript的学习来说,闭包这一块一直是玄而又玄的东西,初学者很难掌握,我是学了大半年的JS,现在又回...
    韩宝亿阅读 1,137评论 6 33

友情链接更多精彩内容