闭包知识点总结

1. “在内部保存数据和对外无副作用”这两大特性在JavaScript中是通过“函数闭包”来实现的。

 

2. 函数与闭包:在JavaScript中函数只是一段静态的代码,脚本文件,因此它是一个代码书写时,以及编译器的,静态的概念;而闭包则是函数的代码在运行过程中的一个动态环境,是一个运行期的动态的概念。

 

3. 闭包的两个特点:第一是闭包作为与函数成对的数据,在函数执行过程中处于激活(即可访问)状态;第二是闭包在函数运行结束后,保持运行过程的最终数据状态。因此函数的闭包总的来说决定了两件事:闭包所对应的函数代码如何访问数据,以及闭包内的数据何时销毁。

 

4. 闭包包括的是函数运行实例的引用,环境(用来查找全局变量的表),以及一个由所有upvalue引用组成的数组。

 

5. 同一个函数代码块可以有多个函数实例,一个函数实例可以有多个函数引用。

 

6. 闭包是对应于运行期的函数实例的,而不是对应函数(代码块)的。

 

7. JavaScript中函数实例可能拥有多个闭包;函数实例与闭包的生存周期是分别管理的;函数被调用即“()”运算时总是初始化一个闭包,而上次调用中的闭包是否销毁,取决于该闭包中是否有被(其他闭包)引用的变量或数据。

 

8. 因为函数实例与闭包的生存周期是分别管理的,因此一个函数实例(以及其可能的引用)的生存周期,与闭包是没有直接关系的。换而言之,会存在函数变量没有持有闭包的情况。这是因为:闭包创建自函数执行开始之时,在执行中闭包没有被其他对象引用,在函数执行结束时闭包被销毁了,而这时函数实例及其引用都还存在,只是没有与之对应的闭包了。

 

9. 闭包内的标识符优先级:函数形式参数名>arguments>函数名。局部变量与函数形式参数名比较:当形式参数名与未赋值的局部变量名重复时,取形式参数名;当形式参数名与有值的局部变量名重复时,取局部变量值。

 

10. 函数闭包带来的可见性效果:变量在全局声明(用或不用var)则在全局可见;变量在代码任何位置隐式声明(不用var)则在全局可见;变量在函数内显式声明(用var)则在函数内可见,且在其所有的内嵌函数中可见(可见性传递),若在内嵌函数中重复声明某变量将覆盖当前可见的同名变量(可见性覆盖)。

 

11. 由于每一个函数实例都有一份ScriptObject的副本,因此不同的闭包访问到的私有变量会不一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Swift 中的闭包是一个自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。Swift 中的闭包类似于 C 和 Objective-C 中的 blocks、以及其他一些编程语言中的 lambdas。 闭包有以下三种形式: 1. 全局函数,有名字但不能捕获任何值。 2. 嵌套函数,有名字,也能捕获其封闭函数内的值。 3. 闭包表达式,没有名字,使用轻量级语法,可以捕获上下文中的值。 闭包表达式的基本语法如下: ``` { (parameters) -> return type in statements } ``` 其中 `parameters` 为参数列表,可以为空;`return type` 为返回类型,也可以为空;`statements` 为闭包体,包含了要执行的代码。 例如,下面的代码定义了一个接受两个整数参数并返回它们之和的闭包: ``` let sum = { (a: Int, b: Int) -> Int in return a + b } ``` 可以像函数一样调用这个闭包: ``` let result = sum(1, 2) print(result) // 输出 3 ``` 闭包可以作为函数的参数或返回值。例如,下面的代码定义了一个接受一个整型数组和一个闭包参数的函数 `apply`: ``` func apply(_ array: [Int], _ transform: (Int) -> Int) -> [Int] { var result = [Int]() for element in array { result.append(transform(element)) } return result } ``` 可以使用闭包表达式作为 `transform` 参数传递: ``` let numbers = [1, 2, 3, 4, 5] let squared = apply(numbers, { (number) -> Int in return number * number }) print(squared) // 输出 [1, 4, 9, 16, 25] ``` 闭包还支持尾随闭包语法,可以将闭包表达式作为函数的最后一个参数传递,并将其放在圆括号之外。例如,上面的代码也可以写成: ``` let squared = apply(numbers) { (number) -> Int in return number * number } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值