1.什么是闭包
闭包是由函数及其相关引用环境组成的实体,一般是通过在匿名函数中引用外部函数的局部变量或者全局变量构成。
我们可以说:闭包=函数+引用环境
2.注意事项
1.闭包对闭包外的环境引入是直接引用的,编译器会自动将闭包引用的外部变量分配到堆上
2.如果函数返回的闭包引用了该函数的局部变量(参数或者内部变量):
(1)多次调用该函数,返回的多个闭包所引用的外部变量是多个副本,原因是每次调用函数都会为局部变量分配内存。
(2)用一个闭包函数多次,如果该闭包修改了其引用的外部变量,则每次调用该闭包对该外部变量都有影响,因为闭包函数共享外部引用。
3.闭包的价值
减少全局变量,在函数调用过程中隐式地传递共享变量。
4.闭包使用示例
(引用自尚硅谷)
请编写一个程序,具体要求如下
1)编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包
2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg 后缀,则返回原文件名。
3)要求使用闭包的方式完成
4)strings.HasSuffix , 该函数可以判断某个字符串是否有指定的后缀。
上面代码的总结和说明:
1)返回的匿名函数和 makeSuffix (suffix string) 的 suffix 变量 组合成一个闭包,因为 返回的函数引用到 suffix 这个变量
2)我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入 后缀名,比如 .jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把!