什么是箭头函数
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或new.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数 引用参考MDN
function (a,b){
return a+b
}
//上面函数可以用箭头函数简写为
(a,b) => a+b
箭头函数实际就是个匿名函数,简化了函数的定义,在只有一个参数和一条返回语句时 function return以及{}都可以省略.多个参数或者多条语句时括号和花括号就不可以省略了.
箭头函数的this
箭头函数是没有this的,准确的说是它没有自己的this,它的this是根据上下文继承来的.
箭头函数的定义可不只是简简单单的简化代码,它更多的是被用来改变this的行为特性.
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
---------------------------------
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
上面是我们在闭包学习中抄来的一段代码.我们看第一段,普通函数调用this会指向全局window,所以运行this.name的结果自然就是The window.第二段同样是普通函数,但是函数最开始是通过对象的方法调用object.getNameFunc()(),此时this指向的是调用它的对象object,然后通过缓存将this赋给that,所以最后运行的时候就是object的name了.第二段代码可以用箭头函数更加方便的写出来.
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return () => this.name
}
};
alert(object.getNameFunc()());
箭头函数中的闭包
箭头函数也是可以使用闭包的.
//一个闭包
function foo(){
var i = 0
return function(){
return i++
}
}
var a = foo()
a()
a()
a()
//通过箭头函数可以改写成
var foo = (i = 0 )=> () => i++
var a = foo()
a()
a()
a()
箭头函数中的递归
例如给定一个数字,我们用递归求它的阶层,3的话就是123
function fac(n){
if(n<=0){
return 1
}else{
return n*fac(n-1)
}
}
上面为一个普通的递归求阶乘的函数,我们可以用箭头函数改写为下
var fac = n => {
if(n<=0){
return 1
}else{
return n*fac(n-1)
}
}
我们可以合理的运用三元运算使代码更加优雅
var fac = n => (n<=0? 1 : n*fac(n-1))
不适用的
- 由于箭头函数本身没有this,所以对于call,apply方法无法修改this.
- 箭头函数不能使用new,会抛出错误.
- 箭头函数没有prototype属性.