闭包即一个函数对象,即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量。[??有点拗口??]
闭包的特点:可以捕获和储存上下文的常量或者变量的引用,即使这些常量或者变量在原作用域已经被销毁了,但在代码中仍然可以使用。事实上全局函数和嵌套函数也是一种闭包,对于全局函数它不会捕获任何常量或者变量,而对于嵌套函数则可以捕获其所在函数的常量或者变量。通常我们说的闭包更多指的是闭包表达式,也就是没有函数名称的代码块,因此也叫做匿名闭包。
简单理解就是:闭包保存了一段为匿名函数的代码块,需要的时候再调用。
语法结构相似归类
Ⅰ | Ⅱ | Ⅲ | Ⅳ |
---|---|---|---|
Dart | Python | C/C++ | Java |
JavaScript | Ruby | Objective-C | |
Swift |
p.s. 其实C/C++与Objective-C语法结构上基本相同,就是方法书写不太一样。而且Objective-C兼容C++。
//返回值为一个匿名函数
Function addFunc1() {
return (int a, int b) {
var c = a+b; // 通过闭包使得外部可以间接访问内部匿名函数作用域中的变量`c`
return c;
};
}
var add = addFunc1();// add变量封装了一段执行两个数之和的代码块,即add是执行两数之和的匿名函数
var num = add(1,2);// 需要时载执行加法运算
print("${num.toString()}”);// 输出 3
// 将匿名自执行子函数封装在外部函数内
int addFunc2(int x, int y) {
return (int a, int b) {
return a+b;
}(x, y);// 匿名自执行函数
}
// 外部函数调用了内部匿名自执行函数,间接访问了变量【即a+b的结果】
print("${addFunc2(1, 2).toString()}”);// 输出 3
// Lambda表达式写法,同addFunc2
int addFunc3(int x, int y) {
return ((a, b) => a + b)(x, y);
}
print("${addFunc1(1, 2).toString()}”);// 输出 3
//返回值为一个匿名函数
function addFunc1() {
return function(a ,b) {
let c = a+b // 通过闭包使得外部可以间接访问内部匿名函数作用域中的变量`c`
return c;
}
}
var add = addFunc1()// add变量封装了一段执行两个数之和的代码块,即add是执行两数之和的匿名函数
console.log(add(1,2))// 需要时载执行加法运算
// 将匿名自执行子函数封装在外部函数内
function addFunc2(x, y) {
return function(a, b){
return a+b
}(x, y)// 匿名自执行函数
}
// 外部函数调用了内部匿名自执行函数,间接访问了变量【即a+b的结果】
console.log(addFunc2(1,2)) // 输出 3
// Lambda写法,同addFunc2
function addFunc3(x, y) {
return ((a, b) => a + b)(x, y);
}
console.log(addFunc3(1,2))
int addFunc(int a, int b){// 相当于执行了函数内部的匿名子函数
return ^(int x,int y){
return x+y;
}(a,b);// 自执行Block
}
int num = addFunc(1, 2);
NSLog(@“%d”,num); // 输出 3
// blcok封装了一段代两个数之和的代码块,相当于一个子函数`addNum`
^(int x,int y){
return x+y;
};
// 子函数
int addNum(int x, int y){
return x+y;
}
再来看看函数式写法
@interface AddBlock : NSObject
- (int (^)(int a,int b))add;
@end
@implementation AddBlock
- (int (^)(int,int))add{
return ^(int a, int b){
return a+b;
};
}
@end
// some code...
AddBlock *block = [[AddBlock alloc] init];
block.add(1,2);// 函数式写法
int addFunc(int a, int b){
return [](int x, int y){
return x+y;
}(a, b);// 自执行匿名函数
}
std::cout << addFunc(1,2) << std::endl;// 输出 3
?? ?? 是不柿这些个语言对闭包的写法都差不多,即: ( 形参 ){ 方法体 }( 调用 )
let add = {(a: Int, b: Int) -> Int in
return a+b
}
let num = add(1, 2)
print (num) // 输出 3
coming soon
coming soon
def func
x = 0
->{x += 1 ; p x}
end
add = func
add[] # 输出 1
add.call() # 输出 2
----------End------------
原文:https://www.cnblogs.com/itmarsung/p/13633430.html