前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《JavaScript函数式编程》的读后总结一

《JavaScript函数式编程》的读后总结一

作者头像
前端_AWhile
发布2019-08-29 13:13:21
3650
发布2019-08-29 13:13:21
举报
文章被收录于专栏:前端一会前端一会

在JS中,函数是一等公民。这该怎么理解?为什么说它是“一等”的呢?其实这体现在函数可以去任何值可以去的地方,很少有限制。

  • 函数可以存储为变量
  • 函数可以存储为数组元素
  • 函数可以成为对象的成员变量
  • 函数可以在使用时直接创建出来
  • 函数可以传递给另一个函数
  • 函数可以被另一个函数返回

最后两点其实就是高阶函数的定义,一个高阶函数可以执行以下至少一项操作:以一个函数作为参数返回一个函数作为结果

这两点是不是有点眼熟?没错,还记得闭包的应用场景么?闭包函数作为返回值闭包函数作为参数传递。再进一步回忆下,闭包函数中的自由变量取值自哪里?自由变量的值从函数创建时所处作用域中取得,划重点是创建时,而非调用时。

闭包就是一个普通函数,在该函数生成时会“捕获”附近的值。这个“附近”指的是该函数创建时所处的作用域,这个值就是闭包函数中的自由变量的值。

组织一下语言的表述:闭包就是一个函数,与普通函数的区别在于,它能捕获自身创建时所处作用哉中的值作为自己作用哉内自由变量的值,这个捕获的值可以是任何类型,包括函数,并且该闭包函数在其他作用域中被调用时,仍然能保持对该自由变量值的引用。

闭包最简单的例子就是捕获局部变量:

1function whatWasTheLocal() {
2    var captured = 'oh hai';    //局部变量
3    return function () {
4        return 'The local was ' + captured; //捕获局部变量
5    }
6}
7var res = whatWasTheLocal();
8console.log(res()); //The local was oh hai

局部变量captured的 生命周期只限于函数体内,但是当被一个闭包函数捕获后,它在其他地方调用这个闭包函数时,还会继续存在。

除了捕获局部变量,闭包函数也可以捕获函数参数:

1function fn(rate) {
2    return function (arr) {
3        return arr.map(function (v, i) {
4                    return v*rate;      //闭包函数捕获创建时所处作用域中的函数参数值
5                })
6    }
7}
8var fn10 = fn(10);
9console.log(fn10([2, 4, 5]));   //[ 20, 40, 50 ]

在《JavaScript函数式编程》中看到对闭包有这样的比喻,我觉得非常形象,在此分享下:闭包函数尤如一个吸血鬼,捕获一个部下后给其永久的生命以供驱策,直到这个吸血鬼被摧毁,它的部下才会随之解放并毁灭。

类比闭包,闭包捕获一个其创建时所处作用域中的变量以供其使用,即使该变量所处作用域在程序执行下去时已经销毁,但该变量值由于仍始终被闭包引用,所以系统回收机制会始终视而不见让它一直活着,直到这个闭包被主动销毁,其所链接的那个变量才会被系统认定再无引用而被回收机制回收。

闭包的强大在于可以帮助开发者更方便的抽象,例如:

1function getVal(field) {
2    return function (obj) {
3        return (obj && obj[field])
4    }
5}
6var obj = {name: 'nitx', job: 'f2e', age: 30};
7console.log(getVal('name')(obj));   //nitx

上例中的obj对象也可以换成数组。

在JS的函数式编程中,其实一直在玩的是变量作用域和闭包。无论是普通函数还是闭包函数,首先是理解变量作用域,它是函数各种玩法的理论基础,在理解透变量作用域的前提下,才能明白闭包的真正强大之处。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档