首页 > 其他 > 详细

聊聊闭包(Closures)

时间:2020-09-08 17:24:57      阅读:98      评论:0      收藏:0      [点我收藏+]

一、闭包概念:

闭包即一个函数对象,即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量。[??有点拗口??]

闭包的特点:可以捕获和储存上下文的常量或者变量的引用,即使这些常量或者变量在原作用域已经被销毁了,但在代码中仍然可以使用。事实上全局函数和嵌套函数也是一种闭包,对于全局函数它不会捕获任何常量或者变量,而对于嵌套函数则可以捕获其所在函数的常量或者变量。通常我们说的闭包更多指的是闭包表达式,也就是没有函数名称的代码块,因此也叫做匿名闭包。

简单理解就是:闭包保存了一段为匿名函数的代码块,需要的时候再调用。

二、几种语言闭包的简单使用:

  • Dart ??????小萌新,Flutter成就了这门语言??????
  • JavaScript ??????在微信小程序和 Cocos2D-X开发中有用到过??????
  • Objective-C【即Block】 ?????? iOS开发中烂大街的用法??????
  • C++ ??????通过Clang,发现C++是Objective-C的真身??????
  • Swift ??????逐渐要干掉Objective-C??????
  • Python ?????? all in AI ??????
  • Java 【Java8及以上】 ??????哪都离开Java,不过感觉Java太重了??????
  • Ruby ??????语法结构和python很像??????

语法结构相似归类

Dart Python C/C++ Java
JavaScript Ruby Objective-C
Swift

p.s. 其实C/C++与Objective-C语法结构上基本相同,就是方法书写不太一样。而且Objective-C兼容C++。

1.Dart闭包 【函数作为一等公民】

//返回值为一个匿名函数
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

2.JavaScript闭包 【函数作为一等公民】

//返回值为一个匿名函数
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))

3.Objective-C闭包【即Block】

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);// 函数式写法

4.C++闭包

int addFunc(int a, int b){
    return [](int x, int y){
        return x+y;
    }(a, b);// 自执行匿名函数
}
std::cout << addFunc(1,2) << std::endl;// 输出 3

?? ?? 是不柿这些个语言对闭包的写法都差不多,即: ( 形参 ){ 方法体 }( 调用 )

5.Swift闭包【函数作为一等公民】

let add = {(a: Int, b: Int) -> Int in 
   return a+b 
}
let num = add(1, 2)
print (num) // 输出 3

6.Python闭包

coming soon

7.Java闭包

coming soon

8.Ruby闭包

def func
    x = 0
    ->{x += 1 ; p x}
end

add = func
add[] # 输出 1
add.call() # 输出 2

三、闭包能干嘛?(来自灵魂的拷问)

  • 闭包的价值在于可以作为函数对象或者匿名函数,持有上下文数据,作为第一级对象进行传递和保存。
  • 闭包广泛用于回调函数、函数式编程中。

----------End------------

聊聊闭包(Closures)

原文:https://www.cnblogs.com/itmarsung/p/13633430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!