ES6中,可使用箭头(=>
)函数表达式的语法定义函数,这种函数表达式更适用于那些原本须要匿名函数的地方,注意它们不能用做构造函数。javascript
//参数、返回值单一 var f=x=>x; //多个参数 var f=(x,y)=>x+y; //函数体有多条语句 var f=(x,y)=>{var re=x+y;return re;}; //返回对象必须有:小括号() var f=()=>({name:xuux,age:24}); //使用条件运算符 let max = (a, b) => a > b ? a : b; //闭包( i=0 是默认参数) var Add = (i=0) => {return (() => (++i) )}; var v = Add(); v(); //1 v(); //2 //由于仅有一个返回,return 及括号()也能够省略 var Add = (i=0)=> ()=> (++i); //递归 var fact = (x) => ( x==0 ? 1 : x*fact(x-1) ); fact(5); // 120
做用域链上一层继承this
。(只有在封闭的函数做用域内,才能继承其this;若是在对象字面量内定义的方法,并不能继承对象的this,由于大括号{}不能起到封闭的效果) function Person() { this.age = 0; setInterval(function growUp() { this.age++;//undefined }, 1000); } var p = new Person();
这个间歇调用函数中定义的growUp回调函数
,是在全局做用域下执行的,其this指向全局对象,并非Person构造函数实例对象。
可使用变量缓存来解决:java
function Person() { var that=this; that.age = 0; setInterval(function growUp() { that.age++; }, 1000); } var p = new Person();
箭头函数,建立之初就绑定了做用域链继承的this,在哪里调用没有关系。数组
function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| 正确地指向person对象 }, 1000); } var p = new Person();
arguments
。剩余参数
。function foo() { var f = (...args) => args[0]; return f(2); } foo(1); // 2
call、apply、bind
方法在ES5中都是改变函数中this的指向,而箭头函数没有本身的this指针,所以,经过以上方法调用一个函数时,只能传参,忽略第一个参数。obj = { data: ['John Backus', 'John Hopcroft'], init: function() { document.onclick = ev => { alert(this.data) // ['John Backus', 'John Hopcroft'] } // 非箭头函数 // document.onclick = function(ev) { // alert(this.data) // undefined // } } } obj.init()