ES6中的箭头函数实例详解
本文实例讲述了ES6中的箭头函数。分享给大家供大家参考,具体如下:
语法
我们先来看看箭头函数的语法:
([param][,param])=>{
statements
}
param=>expression
param是参数,根据参数个数不同,分这几种情况:
()=>{…}//零个参数用()表示;
x=>{…}//一个参数可以省略();
(x,y)=>{…}//多参数不能省略();
示例
我们再来看看一些示例,看看在ES5中的函数怎么通过ES6中的箭头函数来替代吧:
//ES5
varselected=allJobs.filter(function(job){
returnjob.isSelected();
});
//ES6
varselected=allJobs.filter(job=>job.isSelected());
当然,也可以定义多个参数:
//ES5
vartotal=values.reduce(function(a,b){
returna+b;
},0);
//ES6
vartotal=values.reduce((a,b)=>a+b,0);
当然=>后面也不一定非得接return之后的语句,看下面:
//ES5
$("#confetti-btn").click(function(event){
playTrumpet();
fireConfettiCannon();
});
//ES6
$("#confetti-btn").click(event=>{
playTrumpet();
fireConfettiCannon();
});
但是需要注意的是,多行语句需要用{}括起来,单行表达式不需要{},并且会作为函数返回值。
x=>{returnx*x};//函数返回x*x
x=>x*x;//同上一行
x=>returnx*x;//SyntaxError报错,不能省略{}
x=>{x*x};//合法,没有定义返回值,返回undefined
和普通函数一样,箭头函数也可以使用剩余参数和默认参数。
varfunc1=(x=1,y=2)=>x+y;
func1();//得到3
varfunc2=(x,...args)=>{console.log(args)};
func2(1,2,3);//输出[2,3]
特性
介绍完了箭头表达式的语法和示例,我们就需要思考一下了。如果箭头表达式仅仅就是简化了函数的命名,我们为什么要改变原来的习惯而去使用它呢?所以我们需要了解一下箭头函数的特性。
箭头函数内部没有constructor方法,也没有prototype,所以不支持new操作。但是它对this的处理与一般的普通函数不一样。箭头函数的this始终指向函数定义时的this,而非执行时。我们通过一个例子来理解:
varo={
x:1,
func:function(){console.log(this.x)},
test:function(){
setTimeout(function(){
this.func();
},100);
}
};
o.test();//TypeError:this.funcisnotafunction
上面的代码会出现错误,因为this的指向从o变为了全局(函数调用中的this都是指向全局的)。如果大家对JavaScript中的this不是很熟悉的话,可以看看前面的一篇文章《javascript中this的用法实例详解》。好了,回归正题,我们需要修改上面的代码如下:
varo={
x:1,
func:function(){console.log(this.x)},
test:function(){
var_this=this;
setTimeout(function(){
_this.func();
},100);
}
};
o.test();
通过使用外部事先保存的this就行了。这里就可以利用到箭头函数了,我们刚才说过,箭头函数的this始终指向函数定义时的this,而非执行时。所以我们将上面的代码修改如下:
varo={
x:1,
func:function(){console.log(this.x)},
test:function(){
setTimeout(()=>{this.func()},100);
}
};
o.test();
这回this就指向o了。
我们还需要注意一点的就是这个this是不会改变指向对象的,我们知道call和apply可以改变this的指向,但是在箭头函数中是无效的。
varx=1,
o={
x:10,
test:()=>this.x
};
o.test();//1
o.test.call(o);//依然是1
希望本文所述对大家ECMAScript程序设计有所帮助。