ES6——箭头函数

1. ES6引入箭头函数的两大优点

①使代码更加简洁,从代码中去掉function、return和{ .. }节省了那些宝贵的键盘输入。

②改变this的行为特性,在箭头函数内部,this的绑定将不是动态的,而是词法的。在前面的代码中,如果使用箭头函数作为回调,this则如我们所愿是可预测的。

2. 使代码简洁

2.1 普通函数与箭头函数对比

//普通函数
function foo(x, y) {
    return x + y;
}
// 使用箭头
var foo = (x, y) => x + y;

2.2 几种不同形式的箭头函数

var f1 = () => 12;
var f2 = x => x * 2;
var f3 = (x, y) => {
    var z = x * 2 + y;
    y++;
    x *= 3;
    return (x + y + z) / 2;
};

①没参数时,箭头前要有小括号;

②单个参数,箭头前面直接写参数;

③多个参数,箭头前面,用小括号将多个参数包裹起来;

④箭头后面是单个表达式,则不用加{},也不用加return;

⑤箭头后面有多个表达式,则需要使用{}将多个表达式包裹起来,且加return

2.3 简洁与可读性的平衡

箭头函数转变带来的可读性提升与被转化函数的长度往往呈负相关。这个函数越长,=>带来的好处就越小;函数越短,=>带来的好处就越大。所以建议只在确实需要简短的在线函数表达式的时候才采用=>,而对于那些一般长度的函数则无需改变。

3. 改变this的行为特性

碰到事件监听时,你是不是也这样做:

var controller = {
    makeRequest: function(..){
        var self = this;
        btn.addEventListener( "click", function(){
        // ..
        self.makeRequest(..);
        }, false );
    }
};

使用箭头函数后,上述代码可改造为:

var controller = {
    makeRequest: function(..){
        btn.addEventListener( "click", () => {
        // ..
            this.makeRequest(..);
        }, false );
    }
};

此时,this的绑定是词法的,是从包围的作用域中词法继承而来的this,即箭头函数的this指向是父级程序的this指向。此处的父级是makeRequest函数,而makeRequest函数的this指向是controller对象,则this.makeRequest能引用到controller中的makeRequest函数。

注意:箭头函数的this指向是父级程序的this指向。如果用错可能会导致程序出错

var controller = {
    makeRequest: (..) => {
    // ..
        this.helper(..);
    },
    helper: (..) => {
        // ..
    }
};
controller.makeRequest(..);

此时,this.helper()找不到。原因是:父级程序的this指向全局作用域中this的指向,即为全局对象,在全局对象中没有helper方法。

4. 何时使用箭头函数

①如果你有一个简短单句在线函数表达式,其中唯一的语句是return某个计算出的值,且这个函数内部没有this引用,且没有自身引用(递归、事件绑定/解绑定),且不会要求函数执行这些,那么可以安全地把它重构为=>箭头函数。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值