美文网首页
ES6~箭头函数

ES6~箭头函数

作者: _既白_ | 来源:发表于2018-12-26 09:51 被阅读8次

    什么是箭头函数

    单表达式箭头函数

    x => x * x
    

    相当于

    function (x) {
        return x * x;
    }
    

    多表达式箭头函数

    箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }return

    x => {
        if (x > 0) {
            return x * x;
        }
        else {
            return - x * x;
        }
    }
    

    如果参数不是一个,就需要用括号()括起来

    // 两个参数:
    (x, y) => x * x + y * y
    
    // 无参数:
    () => 3.14
    
    // 可变参数:
    (x, y, ...rest) => {
        var i, sum = x + y;
        for (i=0; i<rest.length; i++) {
            sum += rest[i];
        }
        return sum;
    }
    

    如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

    // SyntaxError:
    x => { foo: x }
    
    因为和函数体的{ ... }有语法冲突,所以要改为:
    
    // ok:
    x => ({ foo: x })
    
    

    箭头函数不适用场景

    由于箭头函数使得this从“动态”变成“静态”,下面两个场合不应该使用箭头函数。

    • 第一个场合是定义函数的方法,且该方法内部包括this
    
    const cat = {
      lives: 9,
      jumps: () => {
        this.lives--;
      }
    }
    

    上面代码中,cat.jumps()方法是一个箭头函数,这是错误的。调用cat.jumps()时,如果是普通函数,该方法内部的this指向cat;如果写成上面那样的箭头函数,使得this指向全局对象,因此不会得到预期结果

    • 第二个场合是需要动态this的时候,也不应使用箭头函数。
    var button = document.getElementById('press');
    button.addEventListener('click', () => {
      this.classList.toggle('on');
    });
    
    

    上面代码运行时,点击按钮会报错,因为button的监听函数是一个箭头函数,导致里面的this就是全局对象。如果改成普通函数,this就会动态指向被点击的按钮对象。

    另外,如果函数体很复杂,有许多行,或者函数内部有大量的读写操作,不单纯是为了计算值,这时也不应该使用箭头函数,而是要使用普通函数,这样可以提高代码可读性。

    相关文章

      网友评论

          本文标题:ES6~箭头函数

          本文链接:https://www.haomeiwen.com/subject/euvflqtx.html