闭包

闭包

// 坑
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,412评论 1 5
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 我有一个家 家里有个她 一亩三分地 有着我和她 陪她沐浴阳光 伴她数繁星 我和她 青梅竹马 发芽,长高 开花,出嫁...
    西北女记忆阅读 236评论 0 0
  • 2017年前,天水,对我来说,就像是个熟悉的陌生人。 小时候,在天水上了两年学,有几个一直联系的天水同学。 小时候...
    问心浅笑阅读 393评论 17 19