成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6精解:箭頭函數(shù)

HackerShell / 2290人閱讀

摘要:基本用法在中允許使用來(lái)定義函數(shù),如下就等同于從上面可以看出,在箭頭左側(cè)的是代表參數(shù),若參數(shù)只有一個(gè),可以省略,箭頭右側(cè)的表示函數(shù)代碼塊,若代碼塊里面是個(gè)返回值,則可以省略不寫無(wú)參數(shù)情況若箭頭函數(shù)不需要參數(shù),則左側(cè)用代替,如下無(wú)參數(shù)情況無(wú)參數(shù)

基本用法

在ES6中允許使用 => 來(lái)定義函數(shù),如下:

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

就等同于

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

從上面可以看出,在箭頭左側(cè)的是代表參數(shù),若參數(shù)只有一個(gè),()可以省略,箭頭右側(cè)的表示函數(shù)代碼塊,若代碼塊里面是個(gè)返回值,則{}可以省略不寫

1.無(wú)參數(shù)情況

若箭頭函數(shù)不需要參數(shù),則左側(cè)用()代替,如下:

  var f = () => {
      console.log("無(wú)參數(shù)情況");
   }
    f();//無(wú)參數(shù)情況
2.有參數(shù)情況
  var f = (a, b) => {
        return a+b;
   }
    console.log(f(1,2)); //3
 var f = a => a;
 console.log(f(1)); //1

如果箭頭函數(shù)有參數(shù),則需要用()括起來(lái),若只有一個(gè)參數(shù),括號(hào)可以省略不寫

在這里要注意一個(gè)情況,就是當(dāng)箭頭函數(shù)直接返回一個(gè)對(duì)象的時(shí)候,如下:

    var f = () => {name:"liming", age:22}; //報(bào)錯(cuò)
    console.log(f());

這樣寫肯定是報(bào)錯(cuò)的,因?yàn)閧}執(zhí)行時(shí)變成代碼塊,會(huì)去運(yùn)行代碼,所以要用一個(gè)()括起來(lái)才可以,如下:

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

執(zhí)行結(jié)果為:

{name: "liming", age: 22}

以上這個(gè)寫法才是正確的

箭頭函數(shù)注意點(diǎn) 1.this指向
 var a = "全局變量a";
    var obj={
        a:"局部變量a",
        fn1:function(){
            console.log(this.a);
        },
        fn2:()=>{
            console.log(this.a);
        }
    }
    obj.fn1();
    obj.fn2();

輸出結(jié)果為:

局部變量a
全局變量a

普通函數(shù)的this我們知道是指向最近的一個(gè)對(duì)象,而箭頭函數(shù)的this實(shí)際上是指向定義時(shí)的this,比如把上面代碼改為:

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

輸出結(jié)果為:

局部變量a
undefined

此時(shí)因?yàn)榧^函數(shù)是指向全局的,全局沒(méi)有變量a則輸出undefined,這里的fn1和fn2都是全局函數(shù),所以箭頭函數(shù)this指向的是定義時(shí)的全局,而普通函數(shù)的this指向的是最近的一個(gè)對(duì)象

上面如果那個(gè)例子不太明白,可以再看下如下例子:

    this.a = "全局a";
    function Timer() {
         this.a = "timer中的a";
        // 普通函數(shù)
        setTimeout(function () {
            console.log("普通函數(shù):", this.a);
        });

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

輸出結(jié)果為:

普通函數(shù): 全局a
箭頭函數(shù): timer中的a

這里普通函數(shù)會(huì)指向全局是因?yàn)?,距離普通函數(shù)最近的對(duì)象是setTimeOut,而setTimeOut是掛在全局作用域中,所以普通函數(shù)指向全局,箭頭函數(shù)指向的是定義時(shí)的對(duì)象,箭頭函數(shù)是在Timer中定義的,所以箭頭函數(shù)指向Timer

如果把以上代碼改為如下:

 this.a = "全局a";
    function Timer() {
         this.a = "timer中的a";
        // 普通函數(shù)
        setTimeout(function () {
            console.log("普通函數(shù):", this.a);
        });

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

輸出結(jié)果:

普通函數(shù): timer中的a
箭頭函數(shù): timer中的a

這個(gè)是為什么呢,因?yàn)槿绻莕ew Timer相當(dāng)于是構(gòu)造函數(shù),構(gòu)造了一個(gè)對(duì)象,如果是Timer()就相當(dāng)于是調(diào)用函數(shù)Timer()這兩者還是有區(qū)別的,如果是調(diào)用函數(shù)Timer(),這個(gè)時(shí)候this的指向都是全局,在局部修改this.a會(huì)覆蓋全局的this.a

通過(guò)以上,我們可以知道普通函數(shù)跟箭頭函數(shù)this指向的區(qū)別是:

普通函數(shù): this指向最靠近的一個(gè)對(duì)象

箭頭函數(shù): this指向定義時(shí)的對(duì)象,也就是說(shuō)箭頭函數(shù)一旦定義完成,它的指向是固定的,沒(méi)法改變,它的指向是定義時(shí)所在的作用域,而不是執(zhí)行時(shí)的作用域

2.不可以當(dāng)做構(gòu)造函數(shù)

箭頭函數(shù)不可以當(dāng)做構(gòu)造函數(shù),也就是不可以new一個(gè),否則會(huì)報(bào)錯(cuò),如下:

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

以上會(huì)報(bào)錯(cuò),因?yàn)榧^函數(shù)本身沒(méi)有屬于自己的this,所以箭頭函數(shù)不可以當(dāng)做構(gòu)造函數(shù),也因?yàn)榧^函數(shù)沒(méi)有自己的this,所以call()、apply()、bind()這些方法去改變this的指向?qū)^函數(shù)也是無(wú)效的,如下:

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

輸出結(jié)果為:

["outer"]

把箭頭函數(shù)通過(guò)bind綁定可見無(wú)效,箭頭函數(shù)還是指向全局

以上是個(gè)人總結(jié),有什么不足之處歡迎留言探討!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95719.html

相關(guān)文章

  • ES6精解:promise用法

    前言 今天就簡(jiǎn)單總結(jié)一下promise的用法,在用promise之前,我們要先了解一下什么promise,這個(gè)東西是用來(lái)干什么的? 通俗易懂的講,promise其實(shí)就是一個(gè)構(gòu)造函數(shù),是用來(lái)解決異步操作的,我們平時(shí)其實(shí)還是會(huì)用到挺多的,比如我們經(jīng)常會(huì)嵌套一層層的函數(shù) step1(function (value1) { step2(value1, function(value2){ s...

    enali 評(píng)論0 收藏0
  • ES6精解:變量的解構(gòu)賦值

    摘要:真正被賦值的是后者,而不是前者。第一行語(yǔ)句中,模式是取數(shù)組的第一個(gè)成員,跟圓括號(hào)無(wú)關(guān)第二行語(yǔ)句中,模式是,而不是第三行語(yǔ)句與第一行語(yǔ)句的性質(zhì)一致。本文參考鏈接主要是看了阮一峰老師的文章,自己整理了一下,供后期自己看筆記用的 1.數(shù)組的解構(gòu)賦值 我們知道以前我們給一個(gè)變量賦值要這樣如下: let a = 1; let b = 2; let c = 3; 但是ES6出來(lái)之后,我們可以這樣:...

    neu 評(píng)論0 收藏0
  • ES6精解:let、const、塊級(jí)作用域

    摘要:命令新增了命令,跟類似,都是用來(lái)聲明變量的不允許重復(fù)聲明報(bào)錯(cuò)不存在變量提升報(bào)錯(cuò)正確寫法為既要先定義,后面才能有這個(gè)值,否則會(huì)報(bào)錯(cuò),如果改成會(huì)提示未定義,但是就直接報(bào)錯(cuò)了暫時(shí)性死區(qū)只要在塊級(jí)作用域里面存在則它所聲明的變量就綁定在這個(gè)塊級(jí)作用域 let命令 ES6新增了let命令,跟var類似,都是用來(lái)聲明變量的 1.不允許重復(fù)聲明 { let a = 1; let a =...

    BWrong 評(píng)論0 收藏0
  • JavaScript 編程精解 中文第三版 三、函數(shù)

    摘要:當(dāng)控制流遇到這樣的語(yǔ)句時(shí),它立即跳出當(dāng)前函數(shù)并將返回的值賦給調(diào)用該函數(shù)的代碼。函數(shù)聲明不是常規(guī)的從上到下的控制流的一部分。該函數(shù)調(diào)用控制臺(tái)的來(lái)完成它的工作,然后將控制流返回到第行。 來(lái)源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Functions 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript ...

    xuexiangjys 評(píng)論0 收藏0
  • JavaScript 編程精解 中文第三版 十五、處理事件

    摘要:事件與節(jié)點(diǎn)每個(gè)瀏覽器事件處理器被注冊(cè)在上下文中。事件對(duì)象雖然目前為止我們忽略了它,事件處理器函數(shù)作為對(duì)象傳遞事件對(duì)象。若事件處理器不希望執(zhí)行默認(rèn)行為通常是因?yàn)橐呀?jīng)處理了該事件,會(huì)調(diào)用事件對(duì)象的方法。 來(lái)源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Handling Events 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分...

    Clect 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

HackerShell

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<