自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

=> 箭頭函數 · 方便、快捷,也要小心坑

開發(fā) 前端
箭頭函數是必須要掌握的,今天我們一起來學習一下,它給開發(fā)者帶來方便的同時,也要留意它的「無能」。

箭頭函數是必須要掌握的,今天我們一起來學習一下,它給開發(fā)者帶來方便的同時,也要留意它的「無能」。先看一個例子:

  1. const names = [ 
  2.     'wsy', 
  3.     'suyan', 
  4.     '前端小課' 
  5. ]; 
  6. let lengths = names.map(name => name.length); 
  7. console.log('lengths = ', lengths); 

結果如圖:

[[315154]]

先看下它的語法:

1. 無參數

  1. function call(callback) { 
  2.     callback(); 
  3. call(() => { 
  4.     console.log('arrow void'); 
  5. }); 
  6. // 箭頭函數類似于下面這個函數 
  7. call(function () { 
  8.     console.log('void'); 
  9. }); 

2. 只有一個參數,無返回值

  1. function call(callback) { 
  2.     callback('前端小課'); 
  3. call(name => { 
  4.     console.log('arrow', name); 
  5. }); 
  6. // 箭頭函數類似于下面這個函數 
  7. call(function (name) { 
  8.     console.log(name); 
  9. }); 

3. 只有一個參數,有返回值

  1. function call(callback) { 
  2.     // 返回值為 4 
  3.     let len = callback('前端小課'); 
  4.     console.log(len); 
  5.  
  6. // 只有一行表達式省略大括號 
  7. call(name => name.length); 
  8. // 類似于這個 
  9. call(name => { 
  10.     return name.length; 
  11. }); 
  12. // 箭頭函數類似于下面這個函數 
  13. call(function (name) { 
  14.     return name.length; 
  15. }); 

4.有多個參數,有返回值

  1. function call(callback) { 
  2.     let len = callback(1, 2, 3); 
  3.     console.log(len); // 6 
  4.  
  5. // 多個個參數,有返回值,只有一行表達式省略大括號 
  6. call((a, b, c) => a + b + c); 
  7. // 類似與這個 
  8. call((a, b, c) => { 
  9.     return a + b + c; 
  10. }); 
  11. // 箭頭函數類似于下面這個函數 
  12. call(function (a, b, c) { 
  13.     return a + b + c; 
  14. }); 

從上面這些例子可以知道,每個箭頭函數都能寫出一個與其功能相同的普通函數,那為什么還用箭頭函數?

在 連接你、我、他 —— this 這節(jié)課程中使用箭頭函數解決了 this 指向的問題。不知道你們有沒有發(fā)現(xiàn)當寫下面這兩個函數的時候,VSCode 默認使用的是箭頭函數:

  1. setTimeout(() => { 
  2.     // 這里是箭頭函數 
  3. }, 100); 
  4.  
  5. setInterval(() => { 
  6.     // 這個是箭頭函數 
  7. }, 200); 

使用箭頭函數有幾點需要留意:

1. 讓函數更簡短,上面例 3 就是一個很好的例子;

2. 沒有自己的 this 和 argument,比如有如下代碼:

  1. let person = { 
  2.     name: 'suyan', 
  3.     showName: function (age) { 
  4.         window.setTimeout(() => { 
  5.             console.log('this = ', this); 
  6.             console.log('arguments = ', arguments); 
  7.             console.log(this.name, age); 
  8.         }, 100); 
  9.     } 
  10. }; 
  11. person.showName(20); 

打印結果為:

3. 不能作為構造函數;

  1. let Dog = name => { 
  2.     this.name = name; 
  3. }; 
  4. // 錯誤 Uncaught TypeError: Dog is not a constructor 
  5. let aDog = new Dog('fe'); 
  6.  
  7. let Dog2 = function (name) { 
  8.     this.name = name; 
  9. }; 
  10. // 正確 
  11. let aDog2 = new Dog2('fe'); 

4. 箭頭函數沒有 prototype 屬性:

  1. let Dog = name => { 
  2.     this.name = name; 
  3. }; 
  4. Dog.prototype; // undefined 

5.不能通過 call、apply 綁定 this

  1. var name = 'I am widow'
  2.  
  3. let animal = { 
  4.     name: 'animal', 
  5.     showName: age => { 
  6.         console.log('this = ', this); 
  7.         console.log('name | age = ', this.name, age); 
  8.     } 
  9. }; 
  10. let dog = { 
  11.     name: 'dog' 
  12. }; 
  13.  
  14. animal.showName.call(dog, 20); 
  15. animal.showName.apply(dog, [21]); 
  16. let bindName = animal.showName.bind(dog, 22); 
  17. bindName(); 

運行代碼,結果如下:

由于箭頭函數沒有 this 指針,不能通過 call、apply、bind 的方式來修改 this。只能傳遞參數,this 參數將被忽略。

責任編輯:趙寧寧 來源: 素燕
相關推薦

2009-12-03 09:23:17

PHP長文章分頁函數

2022-03-21 19:24:15

Objects方法false

2022-11-14 07:08:23

Python函數參數

2023-01-05 07:55:59

Zookeeper服務注冊

2021-02-24 09:43:36

MySQL數據庫雙引號

2022-04-21 07:34:34

JDK8JDK7數據

2011-04-21 17:09:09

掃描儀

2022-04-21 09:48:54

JDK8JDK7編碼

2023-06-20 08:25:53

NESTED源碼mybatis

2021-07-28 05:01:29

Lombok前端測試

2019-04-24 16:12:59

iOSSiriMacOS

2011-05-06 14:12:49

投影機

2020-12-16 09:47:01

JavaScript箭頭函數開發(fā)

2010-01-21 08:57:48

2020-03-17 21:53:09

路由器WiFi信號

2021-03-30 15:10:50

Java序列化

2021-08-05 16:36:16

Windows 11操作系統(tǒng)微軟

2010-04-14 10:31:05

2021-08-08 14:15:30

Windows 11Windows微軟

2017-04-21 09:30:40

點贊
收藏

51CTO技術棧公眾號