關於箭頭函數的思考

關於箭頭函數的思考

自從有了ES6箭頭函數這個靈活的功能,如今寫函數都習慣寫成箭頭函數格式es6

() => {}

然而若是不理解箭頭函數的原理,濫用它也會形成很大的影響。
思考下面這個問題app

let func = value => console.log(value)

<!-- 區別 -->

let func = function(value) {
    console.log(value)
}

咱們到平臺上測試一下, 顯然二者不等。函數

let func = value => console.log(value)

// 等同於

"use strict";
var func = function func(value) {
  return console.log(value);
};

console.log()方法返回 undefined
return undefined 與沒有返回值同樣。因此效果上問題中兩種寫法沒有差別。測試

let func = value => value
// 等同於
let func = value => {
  return value
}
// 等同於
var func = function func(value) {
  return value;
};

若是箭頭函數的代碼塊部分多於一條語句,就要使用大括號將它們括起來,而且使用return語句返回。this

var sum = (num1, num2) => { 
    console.log('多條語句狀況');
    return num1 + num2; 
}

那若是我使用了箭頭,使用了大括號,沒使用return呢?prototype

var sum = (num1, num2) => {
    console.log('多條語句狀況');
    num1+num2
}

<!-- 等於-->

'use strict';
var sum = function sum(num1, num2) {
    console.log('多條語句狀況');
    num1 + num2; // 這條語句沒有任何做用
};

因爲大括號被解釋爲代碼塊,因此若是箭頭函數直接返回一個對象,必須在對象外面加上括號指針

let getInfo = name => ({ name: name, job: "moving bricks" });

使用箭頭函數必需要有返回值嗎?code

// 若是箭頭函數只有一行語句,且不須要返回值
let fn = () => void doesNotReturn(); // void

箭頭函數表達式:沒有本身的 this arguments super new.target, 不能用做構造函數,沒有prototype屬性,不能用做生成器對象

箭頭函數不會建立本身的 this, 它只會從本身做用域鏈的上一層繼承this 這點很重要。以下面示例,箭頭函數內的this的做用域上一層即 Person 函數內的 this繼承

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| 正確地指向person 對象
  }, 1000);
}

var p = new Person();

箭頭函數沒有本身的 this 指針, call() apply() bind() 調用的時候, 第一個參數會被忽略 (--- 對於這個,我有疑惑。第一個參數會被忽略是指原先調用 call 方法的 fun.call(thisArg, arg1, arg2, ...)thisArg 會被忽略呢?仍是 arg1會被忽略呢? 咱們來看栗子

var adder = {
  base : 1,
    
  add : function(a) {
    var f = v => v + this.base;
    return f(a); 
  },

  addThruCall: function(a) {
    var f = v => v + this.base;
    var b = {
      base : 2
    };
            
    return f.call(b, a);
  },

  addTest: function(a) {
   var f = v => v + this.base;
    var b = {
      base : 2
    };
            
    return f.call(b, 23, a);
  }
};

console.log(adder.add(1));         // 輸出 2
console.log(adder.addThruCall(1)); // 仍然輸出 2
console.log(adder.addThruCall('a')); // 輸出 24 (23+1)

很明顯了,第一個參數會被忽略 是忽略 call 方法裏的第一個參數(好像是我在思考的時候想多了,這很明顯呀)

參考資源

相關文章
相關標籤/搜索