1.初识

//原始
function add(a,b){
    return (a+b)
}
//箭头
var add=(a,b)=>{a+b};
//调用
add(1,2)

2.讲解

1.箭头函数总是函数表达式( var fn=(){  } );并不存在箭头函数声明( function fn(){} )。

2.作为回调函数,箭头函数的公用还是很大的,如:

var a = [1,2,3,4,5];
//a = a.map( function(v){ retrun v*2 } );
a = a.map( v => v * 2 );
console.log( a );     //[2,4,6,8,10]

3.箭头函数的设计目的之一:改变this的指向问题,看下边的例子:

/*  实例1  */
var obj={
    fn:function(){
        var self=this;    //this指向的是obj这个对象
        btn.addEventListner(\"click\",function(){
            self.fn();    //这里的this指向的是触发的DOM元素
        })
    }
}

//箭头函数
var obj={
    fn:function(){
        btn.addEventListner(\"click\",function(){
            this.fn();    //这里的this指向的是语法环境中调用的obj
        })
    }
}

/*  实例2:this指向混乱的可能  */
var obj={
    fn:()=>{this.fn2()},
    fn2:()=>{ ... }
}
obj.fn();    //此时调用的时候,是在全局进行的,所以语法环境中this就是全局:window

4.切记一点,箭头函数的this是语法环境中传递的,不是动态环境中时刻变换的;

3.区别

1.箭头函数式匿名函数,不可以作为构造函数(不能new出来);

2.箭头函数不绑定arguments参数伪数组,可以使用扩展运算符(...)替代;

3.箭头函数不绑定this,而其内部的this是上下文中调用起始对象;

4.箭头函数无法使用apply,call改变this的指向;

5.箭头函数没有原型属性;

4.使用规则

1.简洁的语句:其中唯一的语句是 return 某个计算出的值,且没有 this 引用,且没有自身引用(递归、事件绑定 / 解绑定),且不会要求函数执行这些,那么可以安全地把它重构为 => 箭头函数。

2.如果你有一个内层函数表达式,依赖于在包含它的函数中调用 var self = this hack 或 者 .bind(this) 来确保适当的 this 绑定,那么这个内层函数表达式应该可以安全地转 换为 => 箭头函数。

3.如果你的内层函数表达式依赖于封装函数中某种像 var args = Array.prototype.slice. call(arguments) 来保证 arguments 的词法复制,那么这个内层函数应该可以安全地转 换为 => 箭头函数。

4.所有的其他情况——函数声明、较长的多语句函数表达式、需要词法名称标识符(递归 等)的函数,以及任何不符合以上几点特征的函数——一般都应该避免 => 函数语法。

底线:=> 是关于 this、arguments 和 super 的词法绑定。这个 ES6 的特性设计用来修正一 些常见的问题,而不是 bug、巧合或者错误。

 

 

收藏 打印