1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        JavaScript箭頭函數(shù)與普通函數(shù)的區(qū)別?

        共 4604字,需瀏覽 10分鐘

         ·

        2021-12-01 10:33

        來源 | https://learn-anything.cn/java-script-arrow-functions


        一、什么是箭頭函數(shù)?

        箭頭函數(shù)用更簡潔的方式,來完成普通函數(shù)的功能,但是不具備普通函數(shù)擁有的屬性:this、 arguments、 super、 new.target,有兩種表達(dá)形式:
        1、(...args) => expression
        args表示參數(shù)有0個、1個、多個;expression表示一個js表達(dá)式,只有一行代碼。
        2、?(...args) => { body }
        args表示參數(shù)有0、1、多個;body表示有多行代碼,最后一行必須是 return語句。

        二、不同表達(dá)形式:

        1、參數(shù)不同,寫法不同
        // 1、沒有參數(shù)let test = () => alert("Hello!");
        // 2、只有一個參數(shù):() 可以省略let test = n => n * 2;let test = (n) => n * 2;
        // 等價于下面普通函數(shù)let test = function (n) { return expression;};
        2、表達(dá)式不同,寫法不同
        // 1、只有一行 return 表達(dá)式,可省略 return 和 {}let func = (arg1, arg2, ...argN) => {  return expression;}// 等價于下面箭頭函數(shù)let func = (arg1, arg2, ...argN) => expression
        // 等價于下面普通函數(shù)。let func = function (arg1, arg2, ...argN) { return expression;};
        3、用于條件運算符
        let age = prompt("What is your age?", 18);
        let welcome = (age < 18) ? () => alert('Hello') : () => alert("Greetings!");
        welcome();
        4、用于數(shù)組遍歷
        var elements = [    'Hydrogen',    'Helium',    'Lithium',    'Beryllium'];
        // 1、普通函數(shù)寫法:elements.map(function (element) { return element.length;});
        // 2、箭頭函數(shù)寫法:elements.map((element) => { return element.length;});
        // 3、只有一個參數(shù),可省略()elements.map(element => { return element.length;});
        // 4、表達(dá)式只有一行return語句,可省略 return 和 {}elements.map(element => element.length);
        // 5、參數(shù)解構(gòu)方式// elements數(shù)組中每一項都有l(wèi)ength屬性,可以通過參數(shù)解構(gòu)獲得結(jié)果,方法如下:// 注意:lengthFooBArX只是一個變量,可以替換成任意合法變量名elements.map(({ "length": lengthFooBArX }) => lengthFooBArX);
        // 以上輸出結(jié)果都為: [8, 6, 7, 9]
        5、用于遞歸
        var fact = (x) => (x == 0 ? 1 : x * fact(x - 1));fact(5);
        // 輸出:120
        6、使用閉包
        // 1、箭頭函數(shù)體的閉包( i=0 是默認(rèn)參數(shù))var Add = (i = 0) => {    return (() => (++i))};var v = Add();v();           //1v();           //2
        // 因為僅有一個返回,return 及括號()也可以省略var Add = (i = 0) => () => (++i);
        7、其他形式舉例
        // 1、空的箭頭函數(shù)返回 undefinedlet empty = () => { };
        // 2、立即執(zhí)行函數(shù)表達(dá)式,返回 "foobar"(() => 'foobar')();
        // 3、更簡明的promise鏈promise.then(a => { // ...}).then(b => { // ...});
        // 4、無參數(shù)箭頭函數(shù)在視覺上容易分析setTimeout(() => { console.log('I happen sooner'); setTimeout(() => { // deeper code console.log('I happen later'); }, 1);}, 1);

        三、重要特性

        1、沒有 arguments
        // 1、普通函數(shù)中的arguments正確使用:function foo(n) {    // 隱式綁定 foo函數(shù)的參數(shù) 與 arguments對象.     // arguments[0] 表示傳給foo函數(shù)的第一個參數(shù),也就是n    var f = () => arguments[0] + n;    return f();}foo(1); // 2foo(3); // 6foo(3, 2);//6
        // 2、箭頭函數(shù)中無法使用arguments// ReferenceError: arguments is not definedvar func = (a, b) => { return arguments[0];}
        2、沒有prototype屬性
        var Foo = () => {};console.log(Foo.prototype); // undefined
        3、不能使用new

        箭頭函數(shù)沒有this,不能用作構(gòu)造函數(shù),也就無法使用?new

        var Foo = () => {};var foo = new Foo(); // TypeError: Foo is not a constructor

        四、需要()的場景

        1、對象作為表達(dá)式

        用?()包裹?{}表示的對象來作為表達(dá)式返回,否則?{}會作為表達(dá)式來解析,出現(xiàn)語法錯誤。

        // Calling func() returns undefined!var func = () => { foo: 1 };// SyntaxError: function statement requires a namevar func = () => { foo: function() { } };
        // 正確寫法如下:var func = () => ({ foo: 1 });var func = () => ({ foo: function () { } });
        2、換行
        // 1、語法錯誤:SyntaxError: expected expression, got '=>'var func = ()            => 1;
        // 2、正確,可以在 => 后換行var func = (a, b, c) => 1;// 3、正確,用 () 來換行var func = (a, b, c) => ( 1);
        // 4、正確,用 () 來換行var func = ( a, b, c) => 1;
        3、作為單獨表達(dá)式
        let callback;
        // 1、正確callback = callback || function () { };
        // 2、錯誤:SyntaxError: invalid arrow-function argumentscallback = callback || () => { };
        // 3、正確callback = callback || (() => { }); // ok

        五、箭頭函數(shù)沒有this

        普通函數(shù)、對象方法中的this,都是在運行時定義。

        • 普通函數(shù)的this 等于 undefined,無法調(diào)用;

        • 對象方法的this,指向?qū)ο蟊旧怼?/span>

        • 箭頭函數(shù),不會定義自己的this,它只會繼承自己上一層作用域的this。


        1、對象中的箭頭函數(shù)
        var obj = {    i: 10,    b: () => console.log(this.i, this),    c: function () {        console.log(this.i, this)    }}obj.b();// 輸出結(jié)果:undefined, Window{...}// 箭頭函數(shù)b,沒有上層作用域可以繼承this,也就無法訪問。
        obj.c();// 輸出結(jié)果:10, Object {...}
        2、正確使用箭頭函數(shù)中的this
        // 實例1:function Person() {    this.age = 0;
        // 箭頭函數(shù)作為 setInterval 的一個參數(shù),繼承了 this setInterval(() => { this.age++; console.log("age:", this.age); }, 1000);}
        var p = new Person();
        // 實例2:// 箭頭函數(shù) student 繼承了 showList 的 thislet group = { title: "Our Group", students: ["John", "Pete", "Alice"],
        showList() { this.students.forEach( student => alert(this.title + ': ' + student) ); }};
        group.showList();
        3、普通函數(shù)無法訪問this
        # 普通函數(shù)中 this 等于 undefined ,所用 this.title 必然因為無法識別而報錯let group = {    title: "Our Group",    students: ["John", "Pete", "Alice"],
        showList() { this.students.forEach(function (student) { // Error: Cannot read property 'title' of undefined alert(this.title + ': ' + student) }); }};
        group.showList();

        本文完~



        學(xué)習(xí)更多技能

        請點擊下方公眾號

        瀏覽 68
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            草草在线观看视频 | 日韩久久草 | 国产精品激情在线 | 影音先锋在线成人 | 99er精品 | 国产精品视频在线观看 | 女技师三级做爰按摩 | 97精品超碰一区二区三区 | 国产对白女主播勾搭野战在线 | 免费无遮挡动画网站 |