闭包函数
一、什么是闭包
闭包:通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数产生的一个实例函数。
闭包组成:外部函数+外部函数创建的upvalue+内部函数(闭包函数)
二、如何形成闭包
脚本程序设计语言(ECMAScript)允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
三、闭包的实现
1、内部函数可以访问外部函数中的变量(即upvalue)
2、在创建出来的内部函数变量仍存在时,被其访问的外部函数中的变量不被释放
--lua
function newCounter()
local i = 0 --外部函数的变量
return function()
i = i + 1 --引用了外部函数的变量
return i
end
end
C++
//C++
#include <iostream>
#include <functional>
std::function<int()> make_my_closure(int x){
return [x]() mutable {
++x;
return x;
};
}
int main()
{
auto my_f = make_my_closure(10);
std::cout << my_f() << std::endl; // 11
std::cout << my_f() << std::endl; // 12
std::cout << my_f() << std::endl; // 13
auto my_f1 = make_my_closure(1);
std::cout << my_f1() << std::endl; // 2
std::cout << my_f1() << std::endl; // 3
std::cout << my_f1() << std::endl; // 4
}
四、闭包的优缺点
优点
1.保护函数内的变量安全,加强了封装性
2.在内存中维持一个变量。
缺点
常驻内存,会增大内存使用量,使用不当很容易造成内存泄露