亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

es6函數(shù)之箭頭函數(shù)用法實例詳解

 更新時間:2020年04月25日 14:12:04   作者:wangliang_001  
這篇文章主要介紹了es6函數(shù)之箭頭函數(shù)用法,結(jié)合實例形式詳細分析了es6箭頭函數(shù)基本功能、原理、用法及操作注意事項,需要的朋友可以參考下

本文實例講述了es6函數(shù)之箭頭函數(shù)用法。分享給大家供大家參考,具體如下:

es6允許使用“箭頭”(=>)定義函數(shù)。

var f = v => v
// 等同于
var f = function(v) {
 return v
}

如果箭頭函數(shù)不需要參數(shù)或需要多個參數(shù),就使用一個圓括號代表參數(shù)部分。

var f = () => 5
// 等同于
var f = function() {
 return 5
}

var sum = (num1, num2) => num1 + num2
// 等同于
var sum = function(num1, num2) {
 return num1 + num2
}

如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號將它們括起來,并且使用return語句返回。

var sum = (num1, num2) => {return num1 + num2}

由于大括號被解釋為代碼塊,所以如果箭頭函數(shù)直接返回一個對象,必須在對象外面加上括號,否則會報錯。

// 報錯
let getTempItem = id => {id: id, name: "Temp"}
// 不報錯
let getTempItem = id => ({id: id, name: "Temp"})

下面是一種特殊情況,雖然可以運行,但會得到錯誤的結(jié)果。

let foo = () => {a: 1}

上面代碼中,原始意圖是返回一個對象{a: 1},但是由于引擎認為大括號是代碼塊,所以執(zhí)行了一行語句a: 1,這時,a可以理解為語句的標(biāo)簽,因此實際執(zhí)行了語句是1,然后函數(shù)就結(jié)束了,沒有返回值。

如果箭頭函數(shù)只有一行語句,且不需要返回值,可以采用下面的寫法,就不用寫大括號了。

let fn = () => void doesNotReturn()

箭頭函數(shù)可以與變量解構(gòu)結(jié)合使用。

const full = ({first, last}) => first + ' ' + last
// 等同于
function full(person) {
 return person.first + ' ' + person.last
}

箭頭函數(shù)使用表達更簡潔。

const isEven = n => n % 2 === 0
const square = n => n * n

箭頭函數(shù)的一個用處是簡化回調(diào)函數(shù)。

// 正常函數(shù)寫法
[1, 2, 3].map(function(x) {
 return x * x
})
// 箭頭函數(shù)寫法
[1, 2, 3].map(x => x * x)

下面是rest參數(shù)與箭頭函數(shù)結(jié)合的例子。

const numbers = (...nums) => nums

numbers(1, 2, 3, 4, 5)

const headAndTail = (head, ...tail) => [head, tail]

headAndTail(1, 2, 3, 4, 5)

使用注意點

1)函數(shù)體內(nèi)的this對象,就是定義所在的對象,而不是使用時所在的對象。
2)不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用new命令,否則會拋出一個錯誤。
3)不可以使用arguments對象,該對象在函數(shù)體內(nèi)不存在,如果要用,可以用rest參數(shù)代替。
4)不可以使用yield命令,因此箭頭函數(shù)不能用作Generator函數(shù)。

function foo () {
 setTimeout(() => {
 console.log('id: ', this.id)
 }, 100)
}

var id = 21

foo.call({id: 42})

上面代碼中,setTimeout的參數(shù)是一個箭頭函數(shù),這個箭頭函數(shù)的定義生效是在foo函數(shù)生成時,而它的真正執(zhí)行要等到100ms后。如果是普通函數(shù),執(zhí)行時this應(yīng)該指向全局對象window,這時應(yīng)該輸出21。但是,箭頭函數(shù)導(dǎo)致this總是指向函數(shù)定義生效時所在的對象,所在輸出的是42.

箭頭函數(shù)根本沒有自己的this,導(dǎo)致內(nèi)部的this就是外層代碼塊的this,正是因為它沒有this,所以也就不能用作構(gòu)造函數(shù)。

除了this,以下三個變量在箭頭函數(shù)之中也是不存在的:

arguments, super, new.target

別外,由于箭頭函數(shù)沒有自己的this,所以當(dāng)然也就不能用call(),apply(),bind()這些方法去改變this的指向。

(function() {
 return [
 (() => this.x).bind({x: 'inner'})()
 ]
}).call({x: 'outer'})

不適用場合

由于箭頭函數(shù)使得this從“動態(tài)”變成“靜態(tài)”,下面兩個場合不應(yīng)該使用箭頭函數(shù)。

第一個場合是定義函數(shù)的方法,且該方法內(nèi)部包括this.

window.lives = 100
var cat = {
 lives: 9,
 jumps: () => { this.lives--; console.log(this.lives)}
}

// 99

上面代碼中,cat.jumps()方法是一個箭頭函數(shù),這是錯誤的。調(diào)用cat.jumps()時,如果是普通函數(shù),該方法內(nèi)部的this指向cat;如果寫成上面那樣的箭頭函數(shù),使得this指向全局對象,因些不會得到預(yù)期結(jié)果。

第二個場合是需要動態(tài)this(事件監(jiān)聽)的時候,也不應(yīng)該使用箭頭函數(shù)。

var button = document.getElementById('press');
button.addEventListener('click', () => {
 this.classList.toggle('on');
});

上面代碼運行時,點擊按鈕會報錯,因為button的監(jiān)聽函數(shù)是一個箭頭函數(shù),導(dǎo)致里面的this就是全局對象。如果改成普通函數(shù),this就會動態(tài)指向被點擊的按鈕對象。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • 詳解JS事件循環(huán)及宏任務(wù)微任務(wù)的原理

    詳解JS事件循環(huán)及宏任務(wù)微任務(wù)的原理

    在js中,我們一般將所有的任務(wù)都分成兩類,一種是同步任務(wù),另外一種是異步任務(wù)。而在異步任務(wù)中,又有著更加細致的分類,那就是微任務(wù)和宏任務(wù)。本文將詳細講解這二者的原理與使用,需要的可以參考一下
    2022-05-05
  • JavaScript實現(xiàn)班級抽簽小程序

    JavaScript實現(xiàn)班級抽簽小程序

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)班級抽簽小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Axios+Spring?Boot實現(xiàn)文件上傳和下載

    Axios+Spring?Boot實現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細介紹了Axios+Spring?Boot實現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Nodejs使用mysql模塊之獲得更新和刪除影響的行數(shù)的方法

    Nodejs使用mysql模塊之獲得更新和刪除影響的行數(shù)的方法

    業(yè)余時間玩nodejs的時候遇到的情況, 在使用mysql模塊連接mysql操作, 想在update, delete語句的時候, 想知道到底update, delete成功了沒有
    2014-03-03
  • js獲取當(dāng)前頁的URL與window.location.href簡單方法

    js獲取當(dāng)前頁的URL與window.location.href簡單方法

    下面小編就為大家?guī)硪黄猨s獲取當(dāng)前頁的URL與window.location.href簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • js實現(xiàn)根據(jù)文件url批量壓縮下載成zip包

    js實現(xiàn)根據(jù)文件url批量壓縮下載成zip包

    本文主要介紹了js實現(xiàn)根據(jù)文件url批量壓縮下載成zip包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 關(guān)于網(wǎng)頁中的無縫滾動的js代碼

    關(guān)于網(wǎng)頁中的無縫滾動的js代碼

    隨便打開一個網(wǎng)頁,基本上都會看到無縫滾動或者輪播圖,比如淘寶還有360官網(wǎng)的首頁。那么這些滾動效果是怎么實現(xiàn)的呢?下面小編給大家分享關(guān)于網(wǎng)頁中的無縫滾動的js代碼,感興趣的朋友一起看下吧
    2016-06-06
  • 修改發(fā)貼的編輯功能

    修改發(fā)貼的編輯功能

    修改發(fā)貼的編輯功能...
    2007-03-03
  • 微信小程序封裝自定義彈窗的實現(xiàn)代碼

    微信小程序封裝自定義彈窗的實現(xiàn)代碼

    這篇文章主要介紹了微信小程序封裝自定義彈窗的實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • JavaScript 應(yīng)用技巧集合[推薦]

    JavaScript 應(yīng)用技巧集合[推薦]

    前段時間我曾經(jīng)對JavaScript中的應(yīng)用技巧進行了收集和總結(jié)這里我將會對這些應(yīng)用技巧進行集中描述,如果你覺得遺漏了一些好用的應(yīng)用技巧,也請在留言中提出,我會及時更新到這篇文章中的。
    2009-08-08

最新評論