箭头函数的语法
参数=>函数体
变式如下:
更多语法细节
1)宽松绑定
箭头函数的优先级作为运算符,是优先级最低的一个运算符
2)函数体味表达式或语句
函数体为表达式时不用大括号,函数体为语句时需要大括号,表达式是
用来生成值的,语句时用来做事情的.
//函数体不需要大括号包裹
const f1 = x => console.log(x);
//函数体不需要大括号包裹
const f2 = x => typeof x;
//函数体需要大括号包裹
const f3 = x =>{throw x};
3)返回对象
前面讲到,返回对象,一定要加括号,不然会报语法错误,但还有一种情况
const f1 = x =>({bar:123});
f1(); //{bar:123}
const f2 = x =>{bar:123};
f2();//undefined
f1返回的是一个正确的对象,f2中的大括号被当做了箭头函数的大括号,而函数体,只有bar:123,bar作为label,
123作为value,符合js语法,因此没有报错。
箭头函数和普通函数的重要区别
1)没有自己的this(最重要的特性)、super、arguments和new.target,它们是离该箭头函数最近的非箭头函数的绑定;
箭头函数中的this与普通函数中的this比较
let obj = {
name:'john',
getName(){
setTimeout(function(){
console.log(this.name);
},1000);
}
};
obj.getName();
在getName这样的异步函数中的this指向的是全局对象window,而我们常常要取obj的name,就需要
第一种方法:
let that = this;
setTimeout(function(){
console.log(that.name);},1000)
第二种方法:
setTimeout(function(){
console.log(this.name);
}.bind(this),1000);
但在箭头函数就完全用不着这些繁琐的方法了,因为箭头函数本身是没有this的,它的this本就绑定在obj上,因此只要
setTimeout(() => {
console.log(this.name);
},1000);
就可以了,相对普通函数来说,就要方便很多了,如果你的开发环境支持es6,就没有理由不使用箭头函数了
2)内部的this无法改变(bind/apply/call对this都没有影响,但仍可传递参数);
setTimeout(() => {
console.log(this.name);
}.bind(null),1000);
这种情况下,仍旧会报SyntaxError的错误。
3)不能使用new来调用(不能用作构造函数,这样让箭头函数更加纯粹,js引擎就能对它进行更好的优化了)。
4)没有原型对象;
5)形参名称不能重复。