ES6 箭頭函數(shù)你正確使用了嗎
作者:歸子莫
來源:SegmentFault 思否社區(qū)
ES6 箭頭函數(shù)你正確使用了嗎
博客說明
文章所涉及的資料來自互聯(lián)網(wǎng)整理和個人總結,意在于個人學習和經(jīng)驗匯總,如有什么地方侵權,請聯(lián)系本人刪除,謝謝!
說明
在ES6中允許使用“箭頭”(=>)定義函數(shù),所以在我們后續(xù)寫代碼的過程中出現(xiàn)的很多的箭頭函數(shù),因為真香!但是也帶來的一些問題,靈魂拷問,你真的了解箭頭函數(shù)嗎?因為不敢肯定作答,故此書。
箭頭函數(shù)
一個簡單箭頭函數(shù)
// es6
const hello = item => item;
// es5 上面的代碼等同于
const hello = function (item) {
return item;
};
用法(三大如果)
如果箭頭函數(shù)不需要參數(shù)或需要多個參數(shù),就使用一個圓括號代表參數(shù)部分。
const hello = () => 'hello';
const sum = (num1, num2) => num1 + num2;
如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號將它們括起來,并且使用return語句返回。
const sum = (num1, num2) => {
let num = 0;
if(num1 && num2){
num = num1 + num2;
}
return num;
}
如果箭頭函數(shù)直接返回一個對象,必須在對象外面加上括號,否則會報錯。
const getInfo = id => ({ id: id, name: "hello" });
四大注意點
以下四點可能被無數(shù)次的提及,并且出現(xiàn)在各大面試題當中,不錯,今天又來了一次。
箭頭函數(shù)沒有自己的 this對象不可以當作構造函數(shù),不可以使用 new命令不可以使用 arguments對象,該對象在函數(shù)體內(nèi)不存在。如果要用,可以用 rest 參數(shù)代替不可以使用 yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù)
箭頭函數(shù)的this指向
this指向函數(shù)運行時所在的對象。箭頭函數(shù)沒有自己的this對象,內(nèi)部的this就是定義時上層作用域中的this。this指向是固定的,相比之下,普通函數(shù)的this指向是可變的。將ES6轉成ES5
// ES6
function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
}
// ES5
function foo() {
var _this = this;
setTimeout(function () {
console.log('id:', _this.id);
}, 100);
}
function test() {
this.s1 = 0;
this.s2 = 0;
// 箭頭函數(shù)
setInterval(() => this.s1++, 1000);
// 普通函數(shù)
setInterval(function () {
this.s2++;
}, 1000);
}
s1 // 1
s2 // 0// 普通函數(shù)
setInterval(function () {
let _this = this;
_this.s2++;
}, 1000);
不能作為構造函數(shù)
this,拿甚構造?所以箭頭函數(shù)也就不能用作構造函數(shù)。也不能使用new關鍵詞。不可以使用arguments對象
arguments指向外層函數(shù)的對應變量,像類似的兄弟還有super、new.targetfunction hello() {
setTimeout(() => {
console.log('args:', arguments);
}, 1000);
}
hello(1,2,3,4)
// args: [1, 2, 3, 4]call()、apply()、bind()這些方法去改變this的指向,因此箭頭函數(shù)的this是”靜態(tài)“的。箭頭函數(shù)的好與壞
this對象一直是一個令人頭痛的問題,使用時小心翼翼,回調(diào)一多,代碼就糊了。正是因為這個”靜態(tài)“的this的出現(xiàn),改善了這一些問題。
評論
圖片
表情
