跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 闭包为什么叫闭包
未分類
8 10 月 2020

闭包为什么叫闭包

闭包为什么叫闭包

資深大佬 : zxCoder 4

学到闭包这个概念,就是函数返回一个函数,然后可以访问外层函数的局部变量? 这个有什么用吗?都是局部变量了,难道不就是为了不让外面访问的吗? 这跟数学上的闭包有什么关系吗?

大佬有話說 (14)

  • 資深大佬 : Cbdy

    是的
    有一些用
    不是
    没有关系

  • 資深大佬 : des

    闭包又叫词法闭包,至于“闭包”这个词是翻译自英文 Closure
    用来指代某些其开放绑定(自由变量)已经由其语法环境完成闭合(或者绑定)的 lambda 表达式,从而形成了闭合的表达式,或称闭包
    https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)

  • 資深大佬 : des

    @des 补充一下参考资料,顺便“闭包”这个描述应该是源于数学

    https://www.zhihu.com/question/422554486
    https://www.zhihu.com/question/333567126/answer/742694242

  • 資深大佬 : geelaw

    https://i.loli.net/2020/10/06/h6lNvGms2EU7DjS.png

    另一个类比:匿名函数 = CPU (提供逻辑),匿名函数所捕捉的变量 = 主存等其他设备(提供环境),闭包 = 可以使用的电脑。

  • 資深大佬 : gbin

    外层函数返回的函数运行时不确定,闭包是为了在外层函数执行完毕后垃圾回收时保存返回的函数需要读取的哪些局部变量。

  • 資深大佬 : az467

    直接的关系好像没有。
    不过我觉得存在第三个词,这个词跟离散上的闭包还有编程上的闭包都有关系。

  • 資深大佬 : Sinksky

    编程上的闭包和数学上的闭包有些不同,编程上的闭包是保存有创建闭包时状态的函数(C++中叫捕获变量),数学上的闭包讲的是运算对于运算域封闭。

  • 資深大佬 : vvxex

    闭包,就是带运行时环境的函数。over

  • 資深大佬 : codingguy

    const accessConf = (function generateAccessor() {
    const config = ‘无法修改的值’;

    return () => {
    return config;
    };
    })();

    accessConf(); // => ‘无法修改的值’

    这是一种使用场景。可以确保 config 只读。

  • 主 資深大佬 : zxCoder

    @codingguy 非杠,但是这样大费周章就是为了让 config 只读。。。 是否还有更加复杂的用处呢

  • 資深大佬 : retanoj

    @zxCoder
    对于 js 而言,在没有 class 的时候,还想要实现像类一样的方法和私有变量的话,是不是就可以用闭包?

  • 資深大佬 : 12tall

    称之为高阶函数更形象一些,个人觉得在 js 里面最直观的例子可以通过设置参数生成不同的线性插值函数

  • 資深大佬 : wei771783057

    严格意义上讲,闭包只有一条定义就是 函数引用了外部变量 。
    所以其实你平常普通函数只要引用了全局变量就形成闭包了,只不过这是全局层面的,
    而一般的形式是 1,一个包裹函数内的函数引用了这个包裹函数内部词法作用域它自身外的变量,如果在包裹函数内这个函数直接就运行了,那就是形成了调用执行栈,然后执行完立马出栈 等垃圾回收 GC 后引用的变量内存就清理掉了,2,但我们一般狭义上闭包指的是包裹函数把这个内部函数返回赋给其他变量,但由于这个内部函数它引用了包裹内它自身外部作用域变量,导致在执行栈依次进出后,被引用的包裹内部变量无法被 GC,这就形成了所谓闭包。
    一般作用
    1,形成内部私有变量,无法被直接访问,必须通过引用它的内部函数获取,可以进行一系列读写访问控制。
    2,制作偏函数,比如 bind,可以接受一些预设参数值,返回一个会用到它们的函数,还有类似的像柯里化,将一个接受多个参数的函数转换成接受单一参数并返回一个接收剩余参数返回结果的函数。
    3,高阶函数,像组合函数 compose,把函数作为参数传入,内部实现其调用形式返回结果,还有像制作防抖节流函数也都是闭包的应用 都是通过预设的参数作为闭包变量返回一个引用它的函数来实现的功能。
    另外 class 类私有字段还在 tc39 提案中,不过 class 还是不太受待见,毕竟只是 prototype 的语法糖而且并不完备,js 社区感觉还是更偏向 FP 一些,,,

  • 資深大佬 : codingguy

    @zxCoder 更复杂的用处想不到了,比如函数柯里化(实现看这里 https://hackernoon.com/currying-in-js-d9ddc64f162e )?
    基本都是用了可以直接访问外层代码块变量的这一便利。
    #13 总结的挺好

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具