自從有了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
方法裏的第一個參數(好像是我在思考的時候想多了,這很明顯呀)
參考資源