ES6 箭头函数

通常函数的定义方法
function fn(...){
    ......
}
// 或者:
var fn = function(...){
    ......    
}
简写方法速记

将原函数的 “function” 关键字和函数名都删掉,并使用 “=>” 连接参数列表和函数体。

function add(a, b){
    return a + b;
}
// 简写为:
(a, b) => { // 删掉了 function 和函数名
    return a + b;
}

var add = function(a, b){
    return a + b;
}
// 简写为:
var add = (a, b) => { // 删掉了 function
    return a + b;
}
附加规则

1.当函数参数只有一个时,括号可以省略;但是没有参数或者大于一个参数时,括号不可以省略。
2.函数体(中括号)中有且只有一行 return 语句时,中括号及 return 关键字可以省略。

新旧函数定义的对比

无参数函数
let fn = function(){
    return 'helloWorld';
}

// 简写为:
let fn = () => { // 但是没有参数时,括号不可以省略
    return 'helloWorld';
}
// 根据规则二,简写为:
let fn = () => 'helloWorld';
一个参数的函数
let fn = function(a){
    return a;
}

// 简写为:
let fn = (a) => {
    return a;
}
// 根据规则一,还可以简写为:
let fn = a => {
    return a;
}
// 根据规则二,还可以简写为:
let fn = a => a;
多个参数的函数
let fn = function(a, b){
    return a + b;
}
// 简写为:
let fn = (a, b) => { // 多于一个参数,圆括号不可省略
    return a + b;
}
// 根据规则二,还可以简写为:
let fn = (a, b) => a + b;
函数体代码多于一行
let fn = function(){
    console.log('hello');
    console.log('world');
    return 'helloWorld';
}
//简写为:
let fn = () => {
    console.log('hello');
    console.log('world');
    return 'helloWorld';
}
函数返回 json 对象时
let fn = function(){
    return {"a": 5};
}

// 简写为:
// let fn = () => {"a": 5}; // 这是错误的
// 应简写为:
let fn = () => ({"a": 5}); // 注意 {} 外的圆括号。
实例
//排序方法1
let arr = [3, 6, 2, 1];
let arr2 = arr.sort(function(a, b){
    return a - b;
});
alert(arr2);

//排序方法2
let arr3 = [939, 23, 0, -1, 94];
let arr4 = arr3.sort((a,b) => a - b);
alert(arr4);
小结:

1.只是一种函数的简写,可用可不用,看程序猿心情;
2.类似于匿名函数,在某些情况下使用,可减少代码量。

注意点

1、箭头函数没有自己的 this 对象,所有 this 固定,不再善变(函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象)

var obj = {
    data: ['John Backus',  'John Hopcroft'],
    init: function() {
        // 箭头函数
        document.onclick = ev => {
            alert(this.data) // ['John Backus', 'John Hopcroft']
        }
        // 非箭头函数
        // document.onclick = function(ev) {
        //     alert(this.data) // undefined
        // }
    }
}
obj.init()

2、不可以当作构造函数,也就是说,不可以对箭头函数使用 new 命令,否则会抛出一个错误

var Person = (name, age) => {
    this.name = name
    this.age = age
}
var p = new Func('John', 33) // error

3、不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替

var func = () => {
    console.log(arguments)
}
func(55)  // error

4、不可以使用yield命令,因此箭头函数不能用作 Generator 函数

不适用场合

1、第一个场合是定义函数的方法,且该方法内部包括 this。

var cat = {
    lives: 9,
    jumps: () => {
        this.lives;
    }
}

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

2、第二个场合是需要动态 this 的时候,也不应使用箭头函数。

var button = document.getElementById('press');
button.addEventListener('click', () => {
    this.classList.toggle('on');
});

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 箭头符号在JavaScript诞生时就已经存在,当初第一个JavaScript教程曾建议在HTML注释内包裹行内脚...
    程序员之路阅读 828评论 0 3
  • 箭头函数是什么?(What) 箭头函数 (Arrow Functions)也称“胖箭头函数”,是ES6全新的特性。...
    _LG_阅读 3,559评论 2 11
  • 当你还是ES6或React初学者的时候,可能你会有这样的困惑?看到代码中出现各式各样的箭头符号,和其附带的...
    放空的小戈戈阅读 2,310评论 2 12
  • 前言 为什么会有视觉笔记、手帐、插画这些混淆点在大家的脑海中呢? 刚接触视觉化表达的小伙伴一定都有过这样的疑惑,视...
    明霞菇凉阅读 2,286评论 0 2
  • 闭包由函数和与其相关的引用环境的组合而成 闭包允许函数访问其引用环境中的变量(又称为自由变量) 广义上来说,所有的...
    zz张哲阅读 249评论 0 0

友情链接更多精彩内容