ES6精解:箭頭函數

基礎用法

在ES6中許可運用 => 來定義函數,以下:

 var f = a => a;
    console.log(f(1)); //1

就等同於

 var f = function(a){
         return a;
    }
    console.log(f(1)); //1

從上面能夠看出,在箭頭左邊的是代表參數,若參數只要一個,()能夠省略,箭頭右邊的示意函數代碼塊,若代碼塊內里是個返回值,則{}能夠省略不寫

1.無參數狀況

若箭頭函數不需要參數,則左邊用()替代,以下:

  var f = () => {
      console.log("無參數狀況");
   }
    f();//無參數狀況

2.有參數狀況

  var f = (a, b) => {
        return a+b;
   }
    console.log(f(1,2)); //3
 var f = a => a;
 console.log(f(1)); //1

假如箭頭函數有參數,則需要用()括起來,若只要一個參數,括號能夠省略不寫

在這裏要注重一個狀況,就是當箭頭函數直接返回一個對象的時刻,以下:

    var f = () => {name:'liming', age:22}; //報錯
    console.log(f());

如許寫肯定是報錯的,由於{}實行時變成代碼塊,會去運轉代碼,所以要用一個()括起來才能夠,以下:

var f = () => ({name:'liming', age:22}); 
console.log(f());

實行效果為:

{name: "liming", age: 22}

以上這個寫法才是準確的

箭頭函數注重點

1.this指向

 var a = '全局變量a';
    var obj={
        a:'部分變量a',
        fn1:function(){
            console.log(this.a);
        },
        fn2:()=>{
            console.log(this.a);
        }
    }
    obj.fn1();
    obj.fn2();

輸出效果為:

部分變量a
全局變量a

一般函數的this我們曉得是指向近來的一個對象,而箭頭函數的this實際上是指向定義時的this,比方把上面代碼改成:

 var obj={
        a:'部分變量a',
        fn1:function(){
            console.log(this.a);
        },
        fn2:()=>{
            console.log(this.a);
        }
    }
    obj.fn1();
    obj.fn2();

輸出效果為:

部分變量a
undefined

此時由於箭頭函數是指向全局的,全局沒有變量a則輸出undefined,這裏的fn1和fn2都是全局函數,所以箭頭函數this指向的是定義時的全局,而一般函數的this指向的是近來的一個對象

上面假如誰人例子不太邃曉,能夠再看下以下例子:

    this.a = '全局a';
    function Timer() {
         this.a = 'timer中的a';
        // 一般函數
        setTimeout(function () {
            console.log('一般函數:', this.a);
        });

        // 箭頭函數
        setTimeout(() => {
            console.log('箭頭函數:',this.a);
    });
    }
   new Timer();

輸出效果為:

一般函數: 全局a
箭頭函數: timer中的a

這裏一般函數會指向全局是由於,間隔一般函數近來的對象是setTimeOut,而setTimeOut是掛在全局作用域中,所以一般函數指向全局,箭頭函數指向的是定義時的對象,箭頭函數是在Timer中定義的,所以箭頭函數指向Timer

假如把以上代碼改成以下:

 this.a = '全局a';
    function Timer() {
         this.a = 'timer中的a';
        // 一般函數
        setTimeout(function () {
            console.log('一般函數:', this.a);
        });

        // 箭頭函數
        setTimeout(() => {
            console.log('箭頭函數:',this.a);
    });
    }
   Timer();

輸出效果:

一般函數: timer中的a
箭頭函數: timer中的a

這個是為何呢,由於假如是new Timer相稱因而組織函數,組織了一個對象,假如是Timer()就相稱因而挪用函數Timer()這兩者照樣有區分的,假如是挪用函數Timer(),這個時刻this的指向都是全局,在部分修正this.a會掩蓋全局的this.a

經由過程以上,我們能夠曉得一般函數跟箭頭函數this指向的區分是:

一般函數: this指向最靠近的一個對象

箭頭函數: this指向定義時的對象,也就是說箭頭函數一旦定義完成,它的指向是牢固的,沒法轉變,它的指向是定義時地點的作用域,而不是實行時的作用域

2.不能夠當作組織函數

箭頭函數不能夠當作組織函數,也就是不能夠new一個,不然會報錯,以下:

    var fn = ()=>{
        console.log("123");
    }
    new fn(); //Uncaught TypeError: fn is not a constructor

以上會報錯,由於箭頭函數自身沒有屬於本身的this,所以箭頭函數不能夠當作組織函數,也由於箭頭函數沒有本身的this,所以call()、apply()、bind()這些要領去轉變this的指向對箭頭函數也是無效的,以下:

  this.x = 'outer';
    (function() {
        console.log([
            (() => this.x).bind({ x: 'inner' })()
        ]);
    })();

輸出效果為:

["outer"]

把箭頭函數經由過程bind綁定可見無效,箭頭函數照樣指向全局

以上是個人總結,有什麼不足之處迎接留言討論!

    原文作者:hope93
    原文地址: https://segmentfault.com/a/1190000015402945
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞