[js高手之路] es6系列教程 - 箭頭函數詳解


箭頭函數是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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM