箭头函数相当于匿名函数,并且简化了函数定义。当你只需要一个只有一个参数的简单函数时,可以使用新标准中的箭头函数,它的语法非常简单:标识符=>表达式。你无需输入function和return,一些小括号、大括号以及分号也可以省略,可在一定程度上减少代码量。
1.规则:
(1)当函数参数只有一个时,括号可以省略;但是没有参数时,括号不可以省略。
如:
(parameters) => { statements }
// 如果没有参数,那么可以进一步简化,但括号不可以省略:
() => { statements }
// 如果只有一个参数,可以省略括号:
parameters => { statements }
(2)函数体(大括号)中有且只有一行return语句时,大括号及return 关键字可以省略。
如:
parameters => expression
// 等价于:
function (parameters){
return expression;
}
(3)如果要写一个接受多重参数(也可能没有参数,或者是不定参数、默认参数、参数解构)的函数,你需要用小括号包裹参数list。
// 无参数:
let fn = ()=>'Rockets';
//等价于
let fn = function(){
return 'Rockets';
}
// 两个参数:
let sum = (num1, num2) => num1 + num2;
// 等价于
let sum = function(num1, num2) {
return num1 + num2;
};
// 不定参数:
(x, y, ...rest) => {
var i, sum = x + y;
for (i=0; i<rest.length; i++) {
sum += rest[i];
}
return sum;
}
(4)箭头函数若要返回自定义对象的话,就必须用小括号把该对象括起来先
如:
var getTempItem = id = > ({
id: id,
name: "Temp"
});
//注:用小括号包含大括号则是对象的定义,而非函数主体
// 等价于:
var getTempItem = function(id) {
return {
id: id,
name: "Temp"
};
};
注意:
(1)使用了块语句的箭头函数不会自动返回值,你需要使用return语句将所需值返回。
如:
var arr = [10, 20, 1, 2];
arr.sort((x, y) => {
return x >= y ;
});
console.log(arr); // [1, 2, 10, 20]
(2)不可以当作构造函数,即,不可以使用new 关键字来实例化对象,否则会抛出一个错误。
(3)不可以使用arguments对象,更不能通过arguments对象访问传入参数,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数.
2.this
(1)普通函数中的this:
a.this总是代表它的直接调用者(js的this是执行上下文), 例如 obj.func ,那么func中的this就是obj
b.在默认情况,没找到直接调用者,则this指的是 window (约定俗成)
c.在严格模式下(使用 ‘use strict’),没有直接调用者的函数中的this是 undefined
d.使用call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象
(2)箭头函数没有它自己的this值,this总是指向词法作用域,也就是外层调用者obj,即 箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象。
举个栗子:
function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
}
var id = 21;
foo.call({ id: 42 });
// id: 42
上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以输出的是42。
如有问题,欢迎提出指教