x=>x*x <======> function(x){ return x*x;}
箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种如上面所示,只包含一个表达式,连{..}和return都省略掉了;还有一种可以包含多条语句,这时不可以省略{..}和return,如果参数有两个,需要用()括起来。
(x,y) =>x*x+y*y; //2个参数
()=>'哈哈'; //无参数
(x,y,...rest)=>{
var i,
sum=x+y;
for(i=0;i<rest.length;i++){
sum+=sum[i];
}
return sum;
}
如果要返回一个对象,就要注意x=>{foo:x} <=====> x=>({foo:x})
箭头函数内部的this词法作用域由上下文确定,所以,用call()或apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略。(一言概之,箭头函数用当前的词法作用域覆盖了this本来的值,无法修改。)
var obj= {
birth:1990,
getAge:function(){
var b = this.birth; //1990
var fn=function(){
console.log(this); //window
return new Date.getFullYear()-this.birth; //this指向undefined或window
} ;
return fn;
};
}
console.log( obj.getAge() ); //NaN
call()和apply()都是为了改变某个函数运行时的context即上下文而存在的。换句话说,就是为了改变函数体内部的this的指向。因为js的函数存在(定义时上下文)和(运行时上下文)以及(运行时上下文是可以改变的)这样的概念,二者的作用完全一样。套用知友说法,马云-挣钱-call(我)
猫想吃猪肉牛肉羊肉可以狗-吃肉-call(猫,猪肉,牛肉,羊肉)
狗-吃肉-apply(猫,[猪肉,牛肉,羊肉])。