箭头函数
ES6允许使用“箭头”(=>
)定义函数。
基本语法: 函数名 = 参数 => 代码块
//ES5 var f = function(v) { return v; }; //ES6 var f = v => v;
如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。
var f = () => 5; // 等同于 var f = function () { return 5 }; var sum = (num1, num2) => num1 + num2; // 等同于 var sum = function(num1, num2) { return num1 + num2; }; //如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。 var sum = (num1, num2) => { return num1 + num2; } //由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。 var getTempItem = id => ({ id: id, name: "Temp" });
箭头函数的一个用处是简化回调函数。
// 正常函数写法 [1,2,3].map(function (x) { return x * x; }); // 箭头函数写法 [1,2,3].map(x => x * x);
箭头函数有几个使用注意点:
(1)函数体内的this
对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new
命令,否则会抛出一个错误。
(3)不可以使用arguments
对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
(4)不可以使用yield
命令,因此箭头函数不能用作Generator函数。
箭头函数的this指向问题
在普通函数中,this的指向是在函数被调用的时候确定的,也就是执行上下文被创建时确定的。this总是指向调用该函数的对象。
但在箭头函数中,this总是指向函数定义生效时所在的对象,是固定的。
//箭头函数 function foo() { setTimeout(() => { console.log('id:', this.id); }, 100); } //普通函数 function foo2(){ setTimeout(function(){ console.log('id:', this.id); },100); } function foo3(){ var that = this; setTimeout(function(){ console.log('id:', that.id); },100); } var id = 21; //箭头函数中,this指向{ id: 42 }对象 foo.call({ id: 42 }); //id: 42 //普通函数中,严格模式下this指向undefined,非严格模式下this指向window对象 foo2.call({ id: 42 }); //id: undefined 非严格模式下 id: 21 foo3.call({ id: 42 }); //id: 42
this
指向的固定化,并不是因为箭头函数内部有绑定this
的机制,实际原因是箭头函数根本没有自己的this
,导致内部的this
就是外层代码块的this
。正是因为它没有this
,所以也就不能用作构造函数。