亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript ES6箭頭函數使用指南

2024-05-06 16:47:21
字體:
來源:轉載
供稿:網友

胖箭頭函數(Fat arrow functions),又稱箭頭函數,是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞說,箭頭函數的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>語法一樣,共享this上下文。

箭頭函數的產生,主要由兩個目的:更簡潔的語法和與父作用域共享關鍵字this。接下來,讓我們來看幾個詳細的例子。

新的函數語法

傳統的JavaScript函數語法并沒有提供任何的靈活性,每一次你需要定義一個函數時,你都必須輸入function () {}。
CoffeeScript如今之所以那么火,有一個不可忽略的原因就是它有更簡潔的函數語法。更簡潔的函數語法在有大量回調函數的場景下好處特別明顯,讓我們從一個Promise鏈的例子看起:

function getVerifiedToken(selector) { return getUsers(selector)  .then(function (users) { return users[0]; })  .then(verifyUser)  .then(function (user, verifiedToken) { return verifiedToken; })  .catch(function (err) { log(err.stack); });}

以下是使用新的箭頭函數語法進行重構后的代碼:

function getVerifiedToken(selector) { return getUsers(selector)  .then(users => users[0])  .then(verifyUser)  .then((user, verifiedToken) => verifiedToken)  .catch(err => log(err.stack));}

以下是值得注意的幾個要點:

function和{}都消失了,所有的回調函數都只出現在了一行里。
當只有一個參數時,()也消失了(rest參數是一個例外,如(...args) => ...)。
當{}消失后,return關鍵字也跟著消失了。單行的箭頭函數會提供一個隱式的return(這樣的函數在其他編程語言中常被成為lamda函數)。
這里再著重強調一下上述的最后一個要求。僅僅當箭頭函數為單行的形式時,才會出現隱式的return。當箭頭函數伴隨著{}被聲明,那么即使它是單行的,它也不會有隱式return:

const getVerifiedToken = selector => { return getUsers()  .then(users => users[0])  .then(verifyUser)  .then((user, verifiedToken) => verifiedToken)  .catch(err => log(err.stack));}

如果我們的函數內只有一條聲明(statement),我們可以不寫{},這樣看上去會和CoffeeScript中的函數非常相似:

const getVerifiedToken = selector => getUsers()  .then(users => users[0])  .then(verifyUser)  .then((user, verifiedToken) => verifiedToken)  .catch(err => log(err.stack));

你沒有看錯,以上的例子是完全合法的ES6語法。當我們談論只包含一條聲明(statement)的箭頭函數時,這并不意味著這條聲明不能夠分成多行寫。

這里有一個坑,當忽略了{}后,我們該怎么返回空對象({})呢?

const emptyObject = () => {};emptyObject(); // ?

不幸的是,空對象{}和空白函數代碼塊{}長得一模一樣。以上的例子中,emptyObject的{}會被解釋為一個空白函數代碼塊,所以emptyObject()會返回undefined。如果要在箭頭函數中明確地返回一個空對象,則你不得不將{}包含在一對圓括號中(({})):

const emptyObject = () => ({});emptyObject(); // {}

下面是一個更完整的例子:

function () { return 1; }() => { return 1; }() => 1 function (a) { return a * 2; }(a) => { return a * 2; }(a) => a * 2a => a * 2 function (a, b) { return a * b; }(a, b) => { return a * b; }(a, b) => a * b function () { return arguments[0]; }(...args) => args[0] () => {} // undefined() => ({}) // {}

this

JavaScript中this的故事已經是非常古老了,每一個函數都有自己的上下文。以下例子的目的是使用jQuery來展示一個每秒都會更新的時鐘:

$('.current-time').each(function () { setInterval(function () {  $(this).text(Date.now()); }, 1000);});

當嘗試在setInterval的回調中使用this來引用DOM元素時,很不幸,我們得到的只是一個屬于回調函數自身上下文的this。一個通常的解決辦法是定義一個that或者self變量:

$('.current-time').each(function () { var self = this;  setInterval(function () {  $(self).text(Date.now()); }, 1000);});

但當使用胖箭頭函數時,這個問題就不復存在了。因為它不產生屬于它自己上下文的this:

$('.current-time').each(function () { setInterval(() => $(this).text(Date.now()), 1000);});

arguments變量

箭頭函數與普通函數還有一個區別就是,它沒有自己的arguments變量:

function log(msg) { const print = () => console.log(arguments[0]); print(`LOG: ${msg}`);} log('hello'); // hello

再次重申,箭頭函數沒有屬于自己的this和arguments。但是,你仍可以通過rest參數,來得到所有傳入的參數數組:

function log(msg) { const print = (...args) => console.log(args[0]); print(`LOG: ${msg}`);} log('hello'); // LOG: hello

關于yield

箭頭函數不能作為generator函數使用。

最后

箭頭函數是我最喜歡的ES6特性之一。使用=>來代替function是非常便捷的。但我也曾見過只使用=>來聲明函數的代碼,我并不認為這是好的做法,因為=>也提供了它區別于傳統function,其所獨有的特性。我個人推薦,僅在你需要使用它提供的新特性時,才使用它:

當只有一條聲明(statement)語句時,隱式return。
需要使用到父作用域中的this。

本文詳細說明了JavaScript ES6新特性之一的箭頭函數的使用方法和一些注意事項,大家在使用時一定要注意,箭頭函數用好了是非??旖莸模绻貌缓玫脑捯彩欠浅A钊祟^痛的


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜精品久久久久久浪潮| 国产精品视频在线观看| 成人国产精品一区二区| 色偷偷综合社区| 日韩高清电影免费观看完整| 日韩在线观看免费高清完整版| 亚洲精品电影久久久| 国产欧美精品一区二区| 日韩精品视频在线观看免费| 欧美精品一区在线播放| 精品久久久精品| 浅井舞香一区二区| 亚洲精品乱码久久久久久金桔影视| 国产精品夫妻激情| 91国语精品自产拍在线观看性色| 欧美精品激情视频| 色噜噜狠狠狠综合曰曰曰88av| 亚洲色图25p| 日韩在线高清视频| 欧美成人在线网站| 欧美国产在线视频| 亚洲香蕉伊综合在人在线视看| 精品国产999| 欧美性猛交xxxx黑人猛交| 欧美乱妇40p| 97久久久免费福利网址| 国产精品久久久久久久久久尿| 97视频在线观看免费| 亚洲精品电影网站| 亚洲一区二区久久| 国产成人精品在线播放| 国产精品永久免费在线| 韩国三级电影久久久久久| 538国产精品一区二区在线| 91视频国产一区| 久久久久久久影视| 两个人的视频www国产精品| 51ⅴ精品国产91久久久久久| 欧美日韩中文字幕日韩欧美| 成人午夜在线视频一区| 色噜噜狠狠色综合网图区| 性欧美视频videos6一9| 日韩av在线资源| 日本欧美在线视频| 日韩精品视频三区| 一区二区三区回区在观看免费视频| 91亚洲一区精品| 欧美激情日韩图片| 26uuu亚洲伊人春色| 久久精品视频免费播放| 欧美极品少妇全裸体| 美日韩在线视频| 久久精品99久久香蕉国产色戒| 日韩高清av一区二区三区| 精品国偷自产在线视频| 亚洲欧美中文字幕在线一区| 久久亚洲春色中文字幕| 清纯唯美亚洲综合| 国产精品扒开腿做爽爽爽男男| 国产精品久久久久久久久久免费| 欧美人在线视频| 国产69精品久久久久9| 欧美麻豆久久久久久中文| 国产在线高清精品| 久久久国产一区二区三区| 精品久久久久久久久久久久| 91久久国产精品91久久性色| 欧美猛少妇色xxxxx| 国产精品美乳在线观看| 亚洲色图校园春色| 亚洲成人精品在线| 国产一区二区日韩精品欧美精品| 久久久国产精品一区| 97精品久久久| 色悠悠久久88| 亚洲深夜福利在线| 国产激情综合五月久久| 亚洲最大av网| 78m国产成人精品视频| 精品欧美一区二区三区| 国产精品久久精品| 亚洲人成在线观看| 亚洲精品女av网站| 国产精品久久久久aaaa九色| 亚洲一区二区在线| 欧美久久精品午夜青青大伊人| 国产自产女人91一区在线观看| 精品人伦一区二区三区蜜桃免费| 992tv在线成人免费观看| 日韩av网站电影| 欧美专区中文字幕| 亚洲国产精品99久久| 5252色成人免费视频| 国产精品久久久久久久久久东京| 国外成人在线直播| 欧美在线视频网| 91精品国产色综合久久不卡98| 国产精品嫩草影院一区二区| 久久久久久久香蕉网| 亚洲精品国产精品自产a区红杏吧| 欧美一级黑人aaaaaaa做受| 国产精品2018| 欧美高清理论片| 欧美精品videossex性护士| 欧美激情a∨在线视频播放| 亚洲专区中文字幕| 久久这里只有精品视频首页| 亚洲人成毛片在线播放| 97超碰蝌蚪网人人做人人爽| 欧美日韩激情小视频| 中国人与牲禽动交精品| 欧美性生活大片免费观看网址| 欧美最顶级丰满的aⅴ艳星| 日本久久精品视频| 久久久久国产视频| 亚洲人成亚洲人成在线观看| 亚洲精品欧美日韩专区| 69av在线视频| 一区二区三区四区在线观看视频| 久久影院资源站| 日韩激情av在线免费观看| 久久精品国产v日韩v亚洲| 亚洲欧洲av一区二区| 国产精品视频xxxx| www.久久色.com| 亚洲午夜精品久久久久久性色| 亚洲精品有码在线| 国产女精品视频网站免费| 久久久亚洲影院| 性色av一区二区三区红粉影视| 国产女人精品视频| 精品国产美女在线| 久久在线免费观看视频| 川上优av一区二区线观看| 亚洲国产日韩一区| 日韩精品在线观| 欧美电影在线播放| 日韩一区二区精品视频| 欧美视频在线视频| 欧美日韩成人网| 亚洲精品小视频在线观看| 久久精品国产一区二区三区| 国产精品极品美女在线观看免费| 国产精品视频专区| 国产精品高精视频免费| 91日本在线视频| 国产精品一区二区电影| 欧美色播在线播放| 中文字幕一区电影| 亚洲性夜色噜噜噜7777| 精品香蕉一区二区三区| 国产精品视频永久免费播放| 国自在线精品视频| 精品久久久久久国产| 精品毛片三在线观看| 久久久国产在线视频| 亚洲天堂开心观看| 欧美在线观看网址综合| 97在线视频免费| 精品久久久久久久久久| 亚洲丝袜在线视频| 九九精品视频在线观看| 97碰在线观看| 日韩男女性生活视频|