ES6 容许应用“箭头”(=>)定义函数。

let xxx = (p1,p2)=>{    console.log(1)    return 2}// 只有一个参数,能够省略括号let xxx = p1 =>{    console.log(1)    return 2}// 代码块只有一句话时,能够省略花括号和returnlet xxx = (p1,p2) => p1+p2// 等同于let xxx = function(p1,p2) {    return p1 + p2;};// 只有一个参数,代码块只有一句话时,能够省略括号、花括号和returnlet xxx = p1 => p1*2// 如果箭头函数不须要参数或须要多个参数,就应用一个圆括号代表参数局部。let f = () => 5;// 等同于let f = function () { return 5 };

箭头函数的一个用途是简化回调函数。

// 失常函数写法[1,2,3].map(function (x) {  return x * x;});// 箭头函数写法[1,2,3].map(x => x * x);

箭头函数 this 的用法

先看个 ES 3 this 的用法的例子

let obj = {    name: 'obj',    hi:function(p1,p2){        console.log(this.name)    }}obj.hi(1,2) //等价于 obj.hi.call(obj,1,2)

能够看出 this 是 call 的第一个参数,如果不传call,很难晓得 this 到底指向谁。

箭头函数有几个应用留神点。

(1)函数体内的this对象,就是定义时所在的对象,而不是应用时所在的对象。

(2)不能够当作构造函数,也就是说,不能够应用new命令,否则会抛出一个谬误。

(3)不能够应用arguments对象,该对象在函数体内不存在。如果要用,能够用 rest 参数代替。

(4)不能够应用yield命令,因而箭头函数不能用作 Generator 函数。

this对象的指向是可变的,然而在箭头函数中,它是固定的。

function foo() {  setTimeout(() => {    console.log('id:', this.id);  }, 100);}var id = 21;foo.call({ id: 42 });// id: 42

箭头函数能够让this指向固定化,这种个性很有利于封装回调函数。上面是一个例子,DOM 事件的回调函数封装在一个对象外面。

var handler = {  id: '123456',  init: function() {    document.addEventListener('click',      event => this.doSomething(event.type), false);  },  doSomething: function(type) {    console.log('Handling ' + type  + ' for ' + this.id);  }};

下面代码的init办法中,应用了箭头函数,这导致这个箭头函数外面的this,总是指向handler对象。否则,回调函数运行时,this.doSomething这一行会报错,因为此时this指向document对象。

箭头函数转成 ES5 的代码如下。

// ES6function foo() {  setTimeout(() => {    console.log('id:', this.id);  }, 100);}// ES5function foo() {  var _this = this;  setTimeout(function () {    console.log('id:', _this.id);  }, 100);}

上面的代码之中有几个this

function foo() {  return () => {    return () => {      return () => {        console.log('id:', this.id);      };    };  };}var f = foo.call({id: 1});var t1 = f.call({id: 2})()(); // id: 1var t2 = f().call({id: 3})(); // id: 1var t3 = f()().call({id: 4}); // id: 1

下面代码之中,只有一个this,就是函数foo的this,所以t1、t2、t3都输入同样的后果。因为所有的内层函数都是箭头函数,都没有本人的this,它们的this其实都是最外层foo函数的this。

除了this,以下三个变量在箭头函数之中也是不存在的,指向外层函数的对应变量:arguments、super、new.target。

function foo() {  setTimeout(() => {    console.log('args:', arguments);  }, 100);}foo(2, 4, 6, 8)// args: [2, 4, 6, 8]

下面代码中,箭头函数外部的变量arguments,其实是函数foo的arguments变量。

另外,因为箭头函数没有本人的this,所以当然也就不能用call()、apply()、bind()这些办法去扭转this的指向。