成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

es6箭頭函數(shù)深入學(xué)習(xí)1

娣辯孩 / 1786人閱讀

摘要:基本用法允許使用箭頭定義函數(shù)。不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會(huì)拋出一個(gè)錯(cuò)誤。箭頭函數(shù)綁定,很大程度上解決了這個(gè)困擾。函數(shù)綁定箭頭函數(shù)可以綁定對(duì)象,大大減少了顯式綁定對(duì)象的寫法。

基本用法
ES6允許使用“箭頭”(=>)定義函數(shù)。

var f = v => v;
上面的箭頭函數(shù)等同于:

var f = function(v) {
return v;
};
如果箭頭函數(shù)不需要參數(shù)或需要多個(gè)參數(shù),就使用一個(gè)圓括號(hào)代表參數(shù)部分。

復(fù)制代碼
var f = () => 5;
// 等同于
var f = function () { return 5 };

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};
復(fù)制代碼
如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號(hào)將它們括起來,并且使用return語句返回。

var sum = (num1, num2) => { return num1 + num2; }
由于大括號(hào)被解釋為代碼塊,所以如果箭頭函數(shù)直接返回一個(gè)對(duì)象,必須在對(duì)象外面加上括號(hào)。

var getTempItem = id => ({ id: id, name: "Temp" });
箭頭函數(shù)可以與變量解構(gòu)結(jié)合使用。

復(fù)制代碼
const full = ({ first, last }) => first + " " + last;

// 等同于
function full(person) {
return person.first + " " + person.last;
}
復(fù)制代碼
使用注意點(diǎn)
箭頭函數(shù)有幾個(gè)使用注意點(diǎn)。

(1)函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。

(2)不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤。

(3)不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用,可以用Rest參數(shù)代替。

(4)不可以使用yield命令,因此箭頭函數(shù)不能用作Generator函數(shù)。

this指向的固定化,并不是因?yàn)榧^函數(shù)內(nèi)部有綁定this的機(jī)制,實(shí)際原因是箭頭函數(shù)根本沒有自己的this,導(dǎo)致內(nèi)部的this就是外層代碼塊的this。正是因?yàn)樗鼪]有this,所以也就不能用作構(gòu)造函數(shù)。

除了this,以下三個(gè)變量在箭頭函數(shù)之中也是不存在的,指向外層函數(shù)的對(duì)應(yīng)變量:arguments、super、new.target。

復(fù)制代碼
function foo() {
setTimeout(() => {

console.log("args:", arguments);

}, 100);
}

foo(2, 4, 6, 8)
// args: [2, 4, 6, 8]
復(fù)制代碼
上面代碼中,箭頭函數(shù)內(nèi)部的變量arguments,其實(shí)是函數(shù)foo的arguments變量。

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

復(fù)制代碼
(function() {
return [

(() => this.x).bind({ x: "inner" })()

];
}).call({ x: "outer" });
// ["outer"]
復(fù)制代碼
上面代碼中,箭頭函數(shù)沒有自己的this,所以bind方法無效,內(nèi)部的this指向外部的this。

長(zhǎng)期以來,JavaScript語言的this對(duì)象一直是一個(gè)令人頭痛的問題,在對(duì)象方法中使用this,必須非常小心。箭頭函數(shù)”綁定”this,很大程度上解決了這個(gè)困擾。

函數(shù)綁定
箭頭函數(shù)可以綁定this對(duì)象,大大減少了顯式綁定this對(duì)象的寫法(call、apply、bind)。但是,箭頭函數(shù)并不適用于所有場(chǎng)合,所以ES7提出了“函數(shù)綁定”(function bind)運(yùn)算符,用來取代call、apply、bind調(diào)用。雖然該語法還是ES7的一個(gè)提案,但是Babel轉(zhuǎn)碼器已經(jīng)支持。

函數(shù)綁定運(yùn)算符是并排的兩個(gè)雙冒號(hào)(::),雙冒號(hào)左邊是一個(gè)對(duì)象,右邊是一個(gè)函數(shù)。該運(yùn)算符會(huì)自動(dòng)將左邊的對(duì)象,作為上下文環(huán)境(即this對(duì)象),綁定到右邊的函數(shù)上面。

復(fù)制代碼
foo::bar;
// 等同于
bar.bind(foo);

foo::bar(...arguments);
// 等同于
bar.apply(foo, arguments);

const hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn(obj, key) {
return obj::hasOwnProperty(key);
}
復(fù)制代碼
如果雙冒號(hào)左邊為空,右邊是一個(gè)對(duì)象的方法,則等于將該方法綁定在該對(duì)象上面。

復(fù)制代碼
var method = obj::obj.foo;
// 等同于
var method = ::obj.foo;

let log = ::console.log;
// 等同于
var log = console.log.bind(console);
復(fù)制代碼
由于雙冒號(hào)運(yùn)算符返回的還是原對(duì)象,因此可以采用鏈?zhǔn)綄懛ā?/p>

尾調(diào)用優(yōu)化
什么是尾調(diào)用?
尾調(diào)用(Tail Call)是函數(shù)式編程的一個(gè)重要概念,本身非常簡(jiǎn)單,一句話就能說清楚,就是指某個(gè)函數(shù)的最后一步是調(diào)用另一個(gè)函數(shù)。

function f(x){
return g(x);
}
上面代碼中,函數(shù)f的最后一步是調(diào)用函數(shù)g,這就叫尾調(diào)用。

“尾調(diào)用優(yōu)化”(Tail call optimization),即只保留內(nèi)層函數(shù)的調(diào)用幀。如果所有函數(shù)都是尾調(diào)用,那么完全可以做到每次執(zhí)行時(shí),調(diào)用幀只有一項(xiàng),這將大大節(jié)省內(nèi)存。這就是“尾調(diào)用優(yōu)化”的意義。

嚴(yán)格模式
ES6的尾調(diào)用優(yōu)化只在嚴(yán)格模式下開啟,正常模式是無效的。

這是因?yàn)樵谡DJ较?,函?shù)內(nèi)部有兩個(gè)變量,可以跟蹤函數(shù)的調(diào)用棧。

func.arguments:返回調(diào)用時(shí)函數(shù)的參數(shù)。
func.caller:返回調(diào)用當(dāng)前函數(shù)的那個(gè)函數(shù)。
尾調(diào)用優(yōu)化發(fā)生時(shí),函數(shù)的調(diào)用棧會(huì)改寫,因此上面兩個(gè)變量就會(huì)失真。嚴(yán)格模式禁用這兩個(gè)變量,所以尾調(diào)用模式僅在嚴(yán)格模式下生效。

復(fù)制代碼
function restricted() {
"use strict";
restricted.caller; // 報(bào)錯(cuò)
restricted.arguments; // 報(bào)錯(cuò)
}
restricted();
復(fù)制代碼
箭頭函數(shù)與常規(guī)函數(shù)對(duì)比
一個(gè)箭頭函數(shù)與一個(gè)普通的函數(shù)在兩個(gè)方面不一樣:

下列變量的構(gòu)造是詞法的: arguments , super , this , new.target
不能被用作構(gòu)造函數(shù):沒有內(nèi)部方法 [[Construct]] (該方法允許普通的函數(shù)通過 new 調(diào)用),也沒有 prototype 屬性。因此, new (() => {}) 會(huì)拋出錯(cuò)誤。
除了那些意外,箭頭函數(shù)和普通的函數(shù)沒有明顯的區(qū)別。例如, typeof 和 instanceof 產(chǎn)生同樣的結(jié)果:

復(fù)制代碼

typeof () => {}
//"function"
() => {} instanceof Function
//true

typeof function () {}
//"function"
function () {} instanceof Function
//true
復(fù)制代碼
函數(shù)表達(dá)式和對(duì)象字面量是例外,這種情形下必須放在括號(hào)里面,因?yàn)樗鼈兛雌饋硐袷呛瘮?shù)聲明和代碼塊。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100479.html

相關(guān)文章

  • 深入理解ES6》筆記——函數(shù)(3)

    摘要:錯(cuò)誤的寫法錯(cuò)誤的寫法中的構(gòu)造函數(shù)新增了支持默認(rèn)參數(shù)和不定參數(shù)。箭頭函數(shù)的簡(jiǎn)單理解箭頭函數(shù)的左邊表示輸入的參數(shù),右邊表示輸出的結(jié)果。但是有了尾調(diào)用優(yōu)化之后,遞歸函數(shù)的性能有了提升。 作為前端切圖仔,越發(fā)覺得自己離不開函數(shù)了。 說到JavaScript函數(shù),腦子里都是匿名函數(shù)、普通函數(shù)、閉包函數(shù)、構(gòu)造函數(shù)......然后還能說出一大堆函數(shù)的概念。如果你達(dá)到這個(gè)水平,那么函數(shù)對(duì)你來說沒有難度...

    DoINsiSt 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0
  • ES6 箭頭函數(shù) 從了解到深入

    摘要:有傳聞?wù)f,箭頭函數(shù)的語法,是受到了的影響,并且它與中的語法一樣,共享上下文。箭頭函數(shù)是新增加的一個(gè)特性。箭頭函數(shù)沒有自己的值,其值是通過繼承其它傳入對(duì)象而獲得的通常來說是上一級(jí)外部函數(shù)的的指向。 箭頭函數(shù) 1. 簡(jiǎn)單的定義: 胖箭頭函數(shù) Fat arrow functions,又稱箭頭函數(shù),是一個(gè)來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,...

    Eminjannn 評(píng)論0 收藏0
  • 學(xué)習(xí)ES6筆記──工作中常用到的ES6語法

    摘要:但是有了尾調(diào)用優(yōu)化之后,遞歸函數(shù)的性能有了提升。常被用來檢查對(duì)象中是否存在某個(gè)鍵名,集合常被用來獲取已存的信息。循環(huán)解構(gòu)對(duì)象本身不支持迭代,但是我們可以自己添加一個(gè)生成器,返回一個(gè),的迭代器,然后使用循環(huán)解構(gòu)和。 一、let和const 在JavaScript中咱們以前主要用關(guān)鍵var來定義變量,ES6之后,新增了定義變量的兩個(gè)關(guān)鍵字,分別是let和const。對(duì)于變量來說,在ES5中...

    curried 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<