美文网首页
ES6变化--箭头函数

ES6变化--箭头函数

作者: LC_Ansel | 来源:发表于2019-02-08 18:50 被阅读0次

箭头函数特点:
1.不用写function关键字
2.只能作为函数使用不能new,没有原型
3.参数不能重复命名
4.返回值可以不写return,但是有时需要配合{}
5.内部arguments this 由定义时外围最接近一层的非剪头函数的arguments和this决定其值

1)这里以sum函数为例

function sum (a, b) {
    return a + b;
};
var sum = function (a, b) {
    return a + b;
};

箭头函数则可写为:

let sum = (a, b) => a + b;

其中亦是没有写return,对应上面第三条
当let sum = (a, b) => {a + b};将a+b放置在块级作用域中不加return则执行后结果为undefined

如果箭头函数返回值是一个对象,需要用表达式的写法

let sum = (a, b) => ({a: a, b: b});
console.log( sum(10, 20) )
image.png

2)高阶函数

//ES5写法
function sum (x) {
    return function (y) {
        return function (z) {
            return x + y + z;
        }
    }
};
sum(1)(2)(3)
var sum1 = sum(1);
var sum2 = sum1(2);
console.log( sum2(3) );
//箭头函数
let sum = x => y => z => x + y + z;

let sum = x => y => z =>  x + y + z;
 
console.log( sum(1)(2)(3) );//也可证明箭头函数是可以被返回的

3)参数不能重复命名
在ES5中参数可以重名

//ES5语法
var sum0 = function(a,a){
    console.log(a+a);
}
sum0(1,2); // 2+2=4 
var sum1 = function (a, a) {
    console.log(a);
}

而箭头函数不可以

let sum = (x, x) => {
}

报出的错误如下


image.png

4)只能作为函数使用不能new,没有原型

let sum = () => {
    this.a = 10;
}
new sum();
image.png

证明成立

  1. 内部arguments this 由定义时外围最接近一层的非剪头函数的arguments和this决定其值
//例1
function outer () {
    // arguments
    // 9 10 11
    let sum = (a, b) => {
        console.log(arguments, a, b);
    };
    sum(1, 2);
}
outer(9, 10, 11);

返回一个箭头函数且这个箭头函数不存在arguments,可以说arguments未定义

function Curry () {
    // var arg = arguments;
    return () => {
        console.log(arguments)
    }
};
Curry('a', 'b')(1, 2);

this问题
我们再看一遍内部this 由定义时外围最接近一层的非剪头函数的this决定其值

var a = 'outerObj';

let sum = () => {
    // window 
    console.log(this.a);
};
sum();//outerObj

我们知道上面的代码中箭头函数sum中的this指向window
接着我们看几个例子:

let obj = {
    a: 'innerObj',
    fn () {
        // this obj
        let sum = () => {
            // obj
            console.log(this.a);
        }
        return sum;
    }
};
let outerSum = obj.fn();
outerSum();//innerObj

将obj.fn()返回的箭头函数sum赋值给outerSum后,执行outerSum(),而fn是一个普通函数,被定义箭头函数sum的外面是fn,所以this指向obj。

let obj = {
    ms: 'abc',
    fn () {
        // obj
        // var self = this;
        setTimeout( function() {
            //this obj
            console.log(this.ms);
        }, 500)
    }
};
obj.fn();

因为setTimeout中存在闭包,this指向window所以运行结果为undefined。解决这种情况有两种方法

//1.通过在fn()中将this赋值给一个新变量
let obj = {
    ms: 'abc',
    fn () {
        // obj
        var self = this;
        setTimeout( function() {
            //this obj
            console.log(self.ms);
        }, 500)
    }
};
obj.fn();
//2.箭头函数
let obj = {
    ms: 'abc',
    fn () {
        // obj
        // var self = this;
        setTimeout( () => {
            //this obj
            console.log(this.ms);
        }, 500)
    }
};
obj.fn();

看一下babel编译之后的箭头函数
测试代码如下:

//1-arrow.js
let sum = x => x * x;

let obj = {
    ms: 'abc',
    fn () {
        // obj
        // var self = this;
        setTimeout( () => {
            //this obj
            console.log(this.ms);
        }, 500)
    }
};

babel命令:npx babel 1-arrow.js -o 1-newarrow.js

//1-newarrow.js可知与普通写法一样
var sum = function sum(x) {
  return x * x;
};

var obj = {
  ms: 'abc',
  fn: function fn() {
    var _this = this;

    // obj
    // var self = this;
    setTimeout(function () {
      //this obj
      console.log(_this.ms);
    }, 500);
  }
};
obj.fn();

我们再看看数组

let arr = [10, 20, 30, 40, 50, 60];
console.log( arr.map(ele => ele * ele) );
console.log( arr.filter(ele => ele > 20) );//过滤大于20的数

对比与以前的数组写法,箭头函数极大地缩短了代码量

最后,我们来总结一下箭头函数的作用:函数目的指向性更强,可读性更好,简化代码,提升开发效率

相关文章

  • javascript的this

    箭头函数的this 关于箭头函数的知识可以参考阮一峰老师的es6 箭头函数的this是固定的,不会变化,总是指向箭...

  • ES6箭头函数简介

    @(JS技巧)[ES6|箭头函数] ES6箭头函数(Arrow Functions) ES6可以使用“箭头”(=>...

  • es6全家桶(二)—— 箭头函数

    es6全家桶(二)—— rest参数、箭头函数 箭头函数 ES6 允许使用“箭头”(=>)定义函数。 var f ...

  • es6、js、css、jquery、vue以及程序设计 知识点总

    es6 列举常用的es6特性。 箭头函数this的指向。 eg:箭头函数的特性 箭头函数内部没有construc...

  • 箭头函数

    ES6允许使用“箭头”(==>)定义函数。 箭头函数 等同于

  • 学习 ES 6 箭头函数

    箭头函数的用法 ES6 允许使用“箭头”(=>)定义函数。 箭头函数的一个用处是简化回调函数。 箭头函数 this...

  • JavaScript箭头函数

    ES6新语法箭头函数 箭头函数是ES6新语法,因为语法简单、可读性好,所以使用的也很多。箭头函数也是匿名函数,区别...

  • 关于ES6箭头this的指向问题

    ES6 允许使用 “ 箭头 ” (=>)定义函数。 箭头函数 填 坑。 this的指向是 向上查找 非箭头函数的...

  • ES6箭头函数(Arrow Functions)

    箭头函数是什么?(What) 箭头函数 (Arrow Functions)也称“胖箭头函数”,是ES6全新的特性。...

  • 2019-01-11

    ES6 箭头函数 箭头函数表示法:()=>console.log('Hello') 箭头函数和普通函数的区别 和普...

网友评论

      本文标题:ES6变化--箭头函数

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