ES6 箭头函数的演变过程和使用技巧
箭头函数:本质上也是一种函数的定义方式
1.function定义函数
//使用function定义函数
var aaa = function(){
}
function bbb(){
}
//字面量中定义函数
var ccc={
    ddd(){
    
    }
} 
2.箭头函数
//1.普通式
var demo = (a,b)=>{
    return a+b;
}
//2.省略式
var sum = (a,b) => a+b;
var multi = a=> a*a; 
3.箭头函数的演变过程
3.1 普通函数
function sum(a,b){
    return a+b;
}
console.log(sum(10,20)); 
3.2 匿名函数
setInterval(function(){
           console.log(to here);
},500); 
3.3省略匿名函数前面的function
setInterval(() => {
           console.log(to here);
},500); 
3.4代码块中单行语句可以省略花括号
setInterval(() => console.log(to here),500);
3.5只有一个形参的时候可以省略小括号
var nums = [1,3,5,6,7,9] let arr = nums.map(item => item*2) console.log(arr)
4.箭头函数的注意事项
4.1箭头函数不会执行构造函数
Normal.prototype.name=原形毕露
function Normal(){}
const normal = new Normal()
console.log(normal.name)
const Arrow = ()=>{}
const a = new Arrow()  
4.2 this指向问题
例1:
<button class="normalButton">普通函数</button> <p class="normalP"></p> <button class="arrowButton">箭头函数</button> <p class="arrowP"></p>
body{
  background:orange;
  display:flex;
  flex-direction:column;
  justify-content:center;
}
.normalButton,.arrowButton{
  height:60px;
  width:240px;
  line-height:60px;
  font-size:24px;
  cursor:pointer;
  margin:20px auto;
}  
const normalButton = document.querySelector(".normalButton")
const arrowButton = document.querySelector(".arrowButton")
const normalP = document.querySelector(".normalP")
const arrowP = document.querySelector(".arrowP")
let normalFunction = function(){
  normalP.innerHTML = "普通函数" + this
}
let arrowFunction = () => {
  arrowP.innerHTML = "箭头函数" + this
}
normalButton.addEventListener(click,normalFunction,false)
arrowButton.addEventListener(click,arrowFunction,false)  
例2:
5.JAVA篇
如果一个接口只有一个,那么这个接口也称之为函数式接口。可以使用@FunctionalInterface注解标识。
@FunctionalInterface
public interface Function {
    int plus(int i,int j);
} 
当我们使用去构造内部类时,我们很简单的表示:
public class Client {
    public static void test(Function function){
        System.out.println(function.plus(1, 2));
    }
    public static void main(String[] args) {
        // 这里我们使用了内部类
        test(new Function() {
            @Override
            public int plus(int i, int j) {
                return i + j;
            }
        });
    }
} 
这样写的话其实和抽象类没有什么区别,并不能体现出函数式接口的优越性
我们可以对之进行简化,
类名方法名全不要,这个结构分为两部分,第一部分,小括号包裹形参,类型也不要、第二部分 ->、第三部分是方法体
public class Client {
    public static void test(Function function){
        System.out.println(function.plus(1, 2));
    }
    public static void main(String[] args) {
        // 这里我们使用了内部类
        test((i,j)->{return i+j;});
    }
} 
只有一行的返回体的话我们甚至可以省略大括号
public class Client {
    public static void test(Function function){
        System.out.println(function.plus(1, 2));
    }
    public static void main(String[] args) {
        // 这里我们使用了内部类
        test((i,j)->return i+j);
    }
}
			          