美文网首页
js笔记04-闭包:定义在一个函数内部的函数

js笔记04-闭包:定义在一个函数内部的函数

作者: 大飞哥 | 来源:发表于2018-01-04 21:42 被阅读21次

函数作为返回值

普通的对数组的求和

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

sum([1, 2, 3, 4, 5]); // 15

如果先不求和,到后面使用到时,再求和,可以这样:

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

调用时

var f = lazy_sum([1, 2, 3, 4, 5]); // function sum() 将f赋值为lazy_sum函数
                                   //里面定义的一个函数名  sum

f();//15 真正调用f()时,才进行计算.

相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构

当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数

闭包

理解 返回的函数并没有立刻执行

function count() {
    var arr = [];
    for (var i=1; i<=3; 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(),f2()和f3()结果应该是1,4,9,但实际结果是:

f1(); // 16
f2(); // 16
f3(); // 16
//全部都是16
//因为函数不是立刻返回的,而且,返回的是 return i * i;
//返回时,i的值已经是4了,所以 答案就是16

返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要用,就再引入函数,使其绑定当前循环变量的值,略过.

闭包不仅仅为了返回一个函数然后延迟执行
封装私有变量:

'use strict';

function create_counter(initial) {
    var x = initial || 0;
    return {
        inc: function () {
            x += 1;
            return x;
        }
    }
}

//这样用

var c1 = create_counter();
c1.inc(); // 1
c1.inc(); // 2
c1.inc(); // 3

var c2 = create_counter(10);
c2.inc(); // 11
c2.inc(); // 12
c2.inc(); // 13

在返回的对象中,实现了一个闭包,该闭包携带了局部变量x,并且,从外部代码根本无法访问到变量x。换句话说,闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。

闭包创建新的函数pow2和pow3:

'use strict';

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

// 创建两个新函数:
var pow2 = make_pow(2);
var pow3 = make_pow(3);

console.log(pow2(5)); // 25
console.log(pow3(7)); // 343

相关文章

  • 前端面试概要(Vue开发)

    JS 篇 闭包 定义:函数内部定义函数,内部函数持有外部函数参数作用 读取函数内部的变量 让这些变量的值始终保持在...

  • 前端面试题(持续补充)

    js,node.js基础: 闭包 闭包是能够读取其他函数内部变量的函数。在js中,只有函数内部的子函数可以访问内部...

  • 闭包(closure)

    闭包 1)闭包定义 闭包:对于一个嵌套定义的函数(函数中定义函数),外部函数的返回值是内部函数,而在内部函数中又引...

  • js 闭包

    闭包 闭包就是能够读取其他函数内部变量的函数。闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内...

  • js封闭函数

    封闭函数定义:(function(){……})() 闭包 闭包的本质就是函数嵌套,就是在函数里面定义函数,内部函数...

  • 闭包

    闭包的概念 假设函数b在函数a的内部进行定义了那么函数b就是一个闭包。 闭包的作用 在函数外部读取函数内部的局部变...

  • Swift中的闭包定义

    定义闭包变量 定义可选闭包变量 定义闭包别名 定义闭包常量 在函数内部 作为函数参数 作为函数参数(隐式参数类型)...

  • day14 装饰器

    Ⅰ 闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间作用域 闭:指的是该函数是定义再一个函数内部的函数...

  • Swift 闭包的定义和使用

    闭包定义 闭包就是能够读取其他函数内部变量的函数,可以理解成定义在一个函数内部的函数。 简单的说它就是一...

  • 十九:Python之闭包

    一:什么是闭包 嵌套定义函数中,内部函数使用外部变量,这是内部函数就被称为闭包 二:如何定义一个闭包 1.函数嵌套...

网友评论

      本文标题:js笔记04-闭包:定义在一个函数内部的函数

      本文链接:https://www.haomeiwen.com/subject/vyednxtx.html