箭頭函數是es6新增的非常有意思的特性,初次寫起來,可能會覺得別扭,習慣之后,會發現很精簡.
什么是箭頭函數?
箭頭函數是一種使用箭頭( => )定義函數的新語法, 主要有以下特性:
- 不能通過new關鍵字調用
- 沒有原型, 因為不能通過new調用,所以沒有原型
- 沒有this, super,arguments和new.target綁定, new.target和super關鍵字是es6新增的
- 箭頭函數中的this,取決於他的上層非箭頭函數的this指向
- 沒有arguments對象,但是可以獲取到外層函數的arguments
- call,apply,bind不能改變箭頭函數的this指向
箭頭函數語法由函數參數、箭頭、函數體組成.
第一種形式: 沒有參數的寫法
1 /* 2 (): 空括號代表: 沒有傳遞參數 3 函數體: console.log( 'ghostwu' ), 只有這一句話,可以不加花括號{} 4 */ 5 let show = () => console.log( 'ghostwu' ); 6 show();
1 //函數體只有一句話,當然也可以加花括號 2 let show = () => { console.log( 'ghostwu' ); } 3 show();
第二種形式: 帶一個參數的寫法
1 /* 2 第一個a 表示 參數a 3 第二個a 表示函數體a, 相當於 return a 4 */ 5 let show = a => a; 6 console.log( show( 10 ) );
1 //如果函數體加了花括號,要用return 2 let show = a => { return a; }; 3 console.log( show( 10 ) );
1 // 當然也可以加小括號 2 let show = (a) => { return a; }; 3 console.log( show( 10 ) );
1 // let show = ( a ) => console.log( a ); 2 // show( 100 ); //100 3 4 // 當函數體有return的時候,必須要加花括號 5 let show = ( a ) => return a; //錯誤
第三種形式: 帶2個以上參數的寫法
1 //當函數有2個以上參數的時候,一定要用小括號 2 // let add = ( a, b ) => a + b; 3 // console.log( add( 10, 20 ) ); //30 4 5 // let add = a, b => a + b; //錯誤 6 // console.log( add( 10, 20 ) ); 7 8 //有return需要加花括號 9 // let add = (a, b) => return a + b; //錯誤 10 // console.log( add( 10, 20 ) ); 11 12 // let add = (a, b) => console.log( a + b ); 13 // add( 10, 20 ); //30 14 15 // let add = ( a, b ) => { return a + b; }; 16 // console.log( add( 10, 20 ) ); //30
返回值如果是對象:
1 //返回值是對象,為了以示區分,用小括號 2 let show = name => ( { 'user' : name } ); 3 let oUser = show( 'ghost' ); 4 console.log( oUser.user );
1 //用了return關鍵字,要用花括號{} 2 let show = name => { return { 'user' : name } }; 3 let oUser = show( 'ghostwu' ); 4 console.log( oUser.user );
1 //對象與傳參用法 2 let show = ( name, age ) => { 3 return { 4 'uName' : name, 5 'uAge' : age 6 }; 7 } 8 let oUser = show( 'ghostwu', 22 ); 9 console.log( oUser.uName , oUser.uAge ); //ghostwu, 22
立即表達式的寫法:
1 //立即表達式的寫法 2 let oUser = ((name, age)=>{ 3 return { 4 "uName" : name, 5 "uAge" : age 6 } 7 })('ghostwu', 25 ); 8 console.log( oUser.uName , oUser.uAge );
箭頭函數不能new
1 let User = () => 'ghostwu'; 2 console.log( User() ); 3 console.log( new User() ); //報錯,箭頭函數不能new
箭頭函數中的this,取決於他的上層非箭頭函數的this指向
1 //this指向他的外層window 2 // var a = 10; 3 // let user = () => { 4 // console.log( this.a ); //this->window 5 // } 6 // user(); //10
1 // 箭頭函數中的this取決於外層函數的this 2 function User( name ) { 3 this.name = name; 4 this.getName = () => { 5 console.log(this); //this指向oUser 6 return this.name; 7 }; 8 } 9 var oUser = new User( 'ghostwu' ); 10 console.log( oUser.getName() );
箭頭函數可以簡化數組的處理
1 //箭頭函數簡化數組處理 2 // let arr = [10,100,0,3,-5]; 3 // arr.sort( ( a, b ) => a - b ); 4 // arr.sort( ( a, b ) => b - a ); 5 // console.log( arr );
箭頭函數取到的是外層的arguments
1 let show = function( name ){ 2 return () => arguments[0]; // ghostwu, 箭頭函數獲取到的是外層的arguments 3 } 4 let fn = show( 'ghostwu' ); 5 console.log( fn() );
call,bind,apply都不能改變箭頭函數中this的指向
1 var n1 = 100; 2 var n2 = 200; 3 let add = () => { 4 return this.n1 + this.n2; 5 }; 6 console.log( add.call( null ) ); //300 7 console.log( add.apply( null ) );//300 8 console.log( add.bind( null )() );//300