91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在JavaScript中使用ES6箭頭函數

發布時間:2021-03-25 17:00:20 來源:億速云 閱讀:175 作者:Leah 欄目:web開發

如何在JavaScript中使用ES6箭頭函數?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

胖箭頭函數(Fat arrow functions),又稱箭頭函數,是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞說,箭頭函數的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>語法一樣,共享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 * 2
a => 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箭頭函數的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴山县| 毕节市| 大英县| 永嘉县| 宕昌县| 闻喜县| 平阴县| 府谷县| 鄯善县| 仁化县| 武夷山市| 且末县| 平邑县| 文水县| 应城市| 博客| 延寿县| 平江县| 高陵县| 赣榆县| 开阳县| 谢通门县| 游戏| 仙居县| 庐江县| 武穴市| 石城县| 宿松县| 永和县| 广河县| 保康县| 定南县| 吉木萨尔县| 黎城县| 华池县| 永顺县| 建湖县| 武定县| 洪泽县| 吴堡县| 绥滨县|