什么是闭包

作者: 三流之路 | 来源:发表于2018-04-01 20:32 被阅读14次

闭包 Closures,最初接触大概是在看 Swift 文档的时候,但是似是而非,好像明白了,好像就没彻底明白,记得当时也查了一些资料,终究是没彻底弄清楚。

后来看 Kotlin 也谈到闭包,看下 Kotlin 里的定义:

A lambda expression or anonymous function (as well as a local function and an object expression) can access its closure, i.e. the variables declared in the outer scope.

Lambda 表达式或者匿名函数(以及局部函数和对象表达式) 可以访问其闭包,即在外部作用域中声明的变量。

好简洁啊,插个题外话,整个 Kotlin 文档的编排顺序,详细度都无法和 Swift 文档相比。

再来看看 Swift 的说明,它说闭包有三种形式:

  • Global functions are closures that have a name and do not capture any values. 全局函数是一个有名字但不会捕获任何值的闭包。
  • Nested functions are closures that have a name and can capture values from their enclosing function. 内嵌函数是一个有名字且能从其上层函数捕获值的闭包。
  • Closure expressions are unnamed closures written in a lightweight syntax that can capture values from their surrounding context. 闭包表达式是一个轻量级语法所写的可以捕获其上下文中常量或变量值的没有名字的闭包。

第一种全局函数,不捕获任何值,也没什么好说的,第二种内嵌函数,这是最常见的类型,第三种其实就是 lambda 表达式,也相当于内嵌函数。

之所以想起写这篇文章,是因为前几周在阅读《函数式编程思维》时,读到里面讲到闭包,突然感觉明白了。

真是不懂的时候感觉好复杂,明白了以后感觉一两句话,不往底层深究的话,实在没什么可以说的。

书里说闭包是一种特殊的函数,暗地绑定了函数内部引用的全部变量。闭包在生成的时候,会把引用的变量全部圈到代码块的作用域里,封闭包围起来,故名『闭包』。

这里用 Swift 文档里的例子来说明

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

外部函数 makeIncrementer 的返回值类型是一个函数 incrementer,而 incrementer 函数本身并没有任何参数,runningTotal 和 amount 都是外部函数的。

当调用 makeIncrementer 返回一个函数时,依然可以调用这个返回的 incrementer 函数返回一个整数,因为 runningTotal 和 forIncrement 已经被它和自己绑定在一起了。每调用一次 runningTotal 的值就递增一个 forIncrement 的大小

// 获得一个闭包实例
let incrementByTen = makeIncrementer(forIncrement: 10)

// 连续调用三次
incrementByTen()
//return a value of 10
incrementByTen()
//return a value of 20
incrementByTen()
//return a value of 30

// 获得另一个闭包
let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()
// returns a value of 7

// 再次调用第一个闭包
incrementByTen()
// returns a value of 40

incrementBySeven 和 incrementByTen 互不影响。因为闭包的每个实例都保有自己的一份变量取值,包括私有变量

相关文章

  • 前端常见问题总结

    什么是闭包?闭包的用途是什么?闭包的缺点是什么? 什么是闭包 闭包:内部函数总是可以访问其所在的外部函数中声明的参...

  • python函数部分

    什么是闭包,闭包的常用用法,怎样判断是不是闭包,闭包的作用是 1、什么是闭包 2、常用用法 3、判断是不是闭包 4...

  • 闭包、call-apply-bind 的用法 、HTTP状态码

    一、什么是闭包?闭包的用途是什么?闭包的缺点是什么? 答 :1、什么是闭包:如果一个函数用到了外部的变量,那么这个...

  • Escaping Closures - Swift

    逃逸闭包和非逃逸闭包 逃逸闭包(escaping closure),什么是逃逸闭包?苹果官方给的定义是:当一个闭包...

  • 深入解析Javascript闭包及实现方法

    一、什么是闭包和闭包的几种写法和用法 1、什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • 闭包,定时器

    问题 1.什么是闭包? 有什么作用 闭包(英语:Closure),又称词法闭包(Lexical Closure)或...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 再次学习 Swift 闭包

    Swift 闭包 1. 什么是闭包? 闭包是自包含的函数代码块,可以在代码中被传递和使用。 2. 闭包能做什么? ...

  • 前端面试题

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 详情可参考:http://www.jianshu.com/...

网友评论

    本文标题:什么是闭包

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