日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js箭头函数和普通函数区别

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js箭头函数和普通函数区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

js箭頭函數和普通函數區別

實驗環境:nodejs v12.16.1

  • 箭頭函數不能作為構造函數,而普通函數可以

  • 箭頭函數沒有原型,而普通函數有

  • 箭頭函數return可以省略語句塊。(如果=>右邊不是語句塊,則代表return右邊的表達式或對象)

  • 箭頭函數不綁定arguments(注意:瀏覽器環境下獲取箭頭函數的arguments會報錯),而普通函數argument綁定了參數列表對象

  • this指向問題[重點,也是難點]

    • 箭頭函數的this指向上層函數作用域的this對象,如果沒有上層函數作用域,則指向頂部this(在瀏覽器中頂部this則是window)。普通函數的this指向該函數的調用者
    • call, apply, bind會改變普通函數的this,但不會改變箭頭函數的this

      實踐是檢驗真理的有效標準,在此,我們必須更加深入了解,再耐心看一個復雜的例子:
      依然是nodejs環境下:
    data = 40; // 全局作用域賦予data=40 this.data = 30; // 給頂部this賦予data=30 let pig = {data: 80, }; let o = {data: 10,a(n) {let f = (n) => {// 分析如下:// 首先f是箭頭函數,那么f的this指向上層函數作用域的this,f的上層函數作用域是a,因此f的this指向a的this// 由于a是普通函數,因此a的this指向a的調用方// 因此f的this指向a的調用方return n + this.data;};return f(n);},b(n) {let f = (n) => {return n + this.data;};let other = {data: 20,};// 分析如下:// 和函數a的情形分析一樣,這里的f的this指向是b的調用方// 然而 call,bind,apply 并不會改變箭頭函數的調用方,因此f.call(other, n)并不會把this指向otherreturn f.call(other, n);},c(n) {let f = function (n) {// 分析如下:// f是普通函數,因此f的this指向f的調用方return n + this.data;};let other = {data: 20,};// 分析如下:// call會改變普通函數的調用方,因此f.call(other, n)把this指向了otherreturn f.call(other, n);},d: (n) => {let f = (n) => {// 分析如下:// f是箭頭函數,因此f的this指向上層函數作用域d的this// 由于d也是箭頭函數,由于d沒有再上層的函數作用域了,因此d的this指向頂部this// 因此f的this指向頂部thisreturn n + this.data;};return f(n);},e(n) {let f = function (n) {return n + this.data;};let other = {data: 20,};// g的this指向other了let g = f.bind(other);return g(n);},e1(n) {let f = function (n) {return n + this.data;};// 注意,nodejs下這里f的調用方是global(注意nodejs下的頂層this并不等于global,頂層this是當前模塊的this)return f(n);},e2(n) {let f = (n) => {return n + this.data;};let other = {data: 20,};// bind對箭頭函數不起作用,f的this -> e2的this -> e2的調用方let g = f.bind(other);return g(n);}, };console.log(o.a(1)); // 11 console.log(o.b(1)); // 11 console.log(o.c(1)); // 21 console.log(o.d(1)); // 31 console.log(o.e(1)); // 21 console.log(o.e1(1)); // 41 console.log(o.e2(1)); // 11console.log(`============接下來比較復雜,但是要搞清楚=========================`);// 分析: // o.a普通函數,因此bind把o.a的this指向pig // o.a里面的f的this指向o.a的調用方,因此f的this指向pig console.log(o.a.call(pig, 1)); // 81console.log(o.b.call(pig, 1)); // 81console.log(o.c.call(pig, 1)); // 21console.log(o.d.call(pig, 1)); // 31console.log(o.e.call(pig, 1)); // 21console.log(o.e1.call(pig, 1)); // 41// 分析 // o.e2普通函數,因此bind把o.e2的this指向pig // o.e2里面的f是箭頭函數,因此f指向上層函數作用域o.e2的this,而o.e2的this指向了pig,因此f的this指向pig // o.e2里面的f是箭頭函數,不會被bind改變指向,因此g的this也指向pig console.log(o.e2.call(pig, 1)); // 81
  • 箭頭函數內不能用yield且不能用作Generator函數,而普通函數可以。

  • 總結

    以上是生活随笔為你收集整理的js箭头函数和普通函数区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。