闭包
闭包函数:声明在一个函数中的函数,叫做闭包函数。
闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
function funA(){
var a = 10; // funA的活动对象之中;
return function(){ //匿名函数的活动对象;
alert(a);
}
}
var b = funA();
b(); //10
package com.banmoon.test.closure;
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
sth((x, y) -> x + y);
sth((x, y) -> x - y);
sth((x, y) -> x * y);
sth((x, y) -> x / y);
}
public static void sth(BiFunction<Integer, Integer, Object> function) {
int x = 5;
int y = 5;
System.out.println(function.apply(x, y));
}
}
协程
目前主流语言基本上都选择了多线程作为并发设施。
其实不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。
协程是用户自己来编写调度逻辑的,对于我们的CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。
优点:
- 无需系统内核的上下文切换,减小开销;
- 无需原子操作锁定及同步的开销,不用担心资源共享的问题;
- 单线程即可实现高并发,单核 CPU 即便支持上万的协程都不是问题,所以很适合用于高并发处理,尤其是在应用在网络爬虫中。
缺点:
协程的本质是个单线程,它不能同时用上单个 CPU 的多个核,协程需要和进程配合才能运行在多 CPU 上。
处处都要使用非阻塞代码。
渐进式框架
根据项目需求逐步引入和使用其功能的框架,而不需要一次性全部使用框架。常见的有:VUE、React、Angular。