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()