傳統函式與箭頭函式寫法差別
傳統函式
取有餘數的值(單數)
1 2 3 4 5 6 7
   | const arr = [1, 2, 3, 4, 5];
  const filterArr = arr.filter(function(item) {   return item % 2  })
  console.log(filterArr); 
   | 
 
箭頭函式
取有餘數的值(單數)
1 2
   | const filterArr = arr.filter(item => item % 2); console.log(filterArr);
   | 
 
箭頭函式可以將 function 移除掉改成箭頭,接著把 {} 、 return 移除掉,改成單行。
箭頭函式它會自動帶上 return
當參數只有一個時,可以把 () 拿掉,當參數有 2 個或沒有參數則不可省略
箭頭函式與傳統函式的 this 指向有何差別?
傳統函式
1 2 3 4 5 6 7 8 9 10 11 12
   | var name = '全域' const person = {   name: '小胖',   callName: function () {      console.log('1', this.name);      setTimeout(function () {       console.log('2', this.name);        console.log('3', this);      }, 10);   }, } person.callName();
   | 
 
箭頭函式
箭頭函式沒有自己的 this
1 2 3 4 5 6 7 8 9 10 11 12
   | var name = '全域' const person = {   name: '小胖',   callName: function () {      console.log('1', this.name);      setTimeout(()=> {       console.log('2', this.name);        console.log('3', this);      }, 10);   }, } person.callName();
   | 
 
如果 setTimeout function 採箭頭函式,那麼 this 就要往外層的 callName function 看。
外層的 callName function 的 this 指向哪裡,那麼內層 setTimeout function 的 this 就指向哪裡。

箭頭函式陷阱
1.
1 2 3 4 5 6 7 8
   | var name = '全域' const person = {   name: '小胖',   callName: () => {      console.log(this.name);   }, } person.callName(); 
   | 
 
因為 callName function 找不到外層函式,所以指向全域
2.
1 2 3 4 5 6 7 8 9 10 11
   | var name = '全域' const person = {   name: '小胖',   callMe() {     const callName = () => {        console.log(this.name);     };     callName();   } } person.callMe();
   | 
 
 callName function 的外層函式是 callMe,callMe 的 this 指向 person ,this.name = 小胖
常見用法
1 2 3 4 5 6 7 8 9 10 11 12
   | var someone = '全域';
  var obj4 = {   someone: '物件 4',   fn() {     setTimeout(function () {       console.log(this.someone);     });   } }
  obj4.fn();
   | 
 
如何讓 setTimeout function 取得 obj4 中的 someone ?
方法 1. this 先指向其他變數
1 2 3 4 5 6 7 8 9 10 11 12 13
   | var someone = '全域';
  var obj4 = {   someone: '物件 4',   fn() {     const vm = this;     setTimeout(function () {       console.log(vm.someone);      });   } }
  obj4.fn();
   | 
 
方法 2. 使用箭頭函式,讓 this 去找外層的
1 2 3 4 5 6 7 8 9 10 11 12
   | var someone = '全域';
  var obj4 = {   someone: '物件 4',   fn() {     setTimeout(()=> {        console.log(this.someone);     });   } }
  obj4.fn();
   |