摘要:正是因為它沒有,所以也就不能用作構(gòu)造函數(shù)。不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會拋出一個錯誤。不可以使用對象,該對象在函數(shù)體內(nèi)不存在。
箭頭函數(shù)
在之前ES5的版本中,我們定義一個函數(shù)的形式如下:
function a() { // do something…… }
但是在ES6中,則新增了箭頭函數(shù)的方式,ES6中允許使用“箭頭”(=>)來定義函數(shù)。
() => { // do something…… }
其中()中代表的是參數(shù)部門,{}中是函數(shù)體部分。
如果箭頭函數(shù)不需要參數(shù)或者需要多個參數(shù)時,需要使用一個()來包裹,當(dāng)只有一個參數(shù)時,可以省略()。
var f = () => 5; // 等同于 var f = function () { return 5 }; var sum = (num1, num2) => num1 + num2; // 等同于 var sum = function(num1, num2) { return num1 + num2; }; var f = v => v; // 等同于 var f = function (v) { return v; };
當(dāng)我們在函數(shù)中返回一個對象時,之前的寫法是:
var f = function(id) { return { id: id, name: "name" } }
此時如果改為箭頭函數(shù)的方式來寫時,需要注意的是,由于在ES6中{}代表了一個代碼塊,所以在返回一個對象的時候,需要在對象{}外面使用括號包起來:
let f = id => ({id: id, name: "name"})
如果箭頭函數(shù)只有一行語句,且不需要返回值,可以采用下面的寫法,就不用寫大括號了。
let fn = () => void doesNotReturn();
不難發(fā)現(xiàn),ES6中的箭頭函數(shù)相對ES5中的函數(shù)的寫法更加的簡潔方便
const isEven = n => n % 2 == 0; const square = n => n * n;
如上面只是簡單地兩行,就定義了兩個常用的工具函數(shù)。按照之前的寫法則會書寫多行。特別是在針對回調(diào)函數(shù)的時候,更能夠起到簡化的作用:
// ES5的寫法 var evens = [1,2,3,4,5]; var odds = evens.map(function(v){ return v + 1 }) // ES6的寫法 let evens = [1,2,3,4,5]; let odds = evens.map(v => v + 1)箭頭函數(shù)的this的綁定
箭頭函數(shù)和普通函數(shù)的另一個區(qū)別,在于this的綁定。例如:
var factory = function() { this.a = "a"; this.b = "b"; this.c = { a : "a+", b : function() { return this.a } } } console.log(new factory().c.b()) // "a+"
通過上面的代碼執(zhí)行可以看出,得到的結(jié)果是“a+”,從而可以看出this.a指向的是c.a。有人曾總結(jié)過this的指向是該函數(shù)被調(diào)用的對象。此處b是c調(diào)用的,所以指向c中的a?,F(xiàn)在修改為ES6的箭頭函數(shù)的寫法:
let factory = function() { this.a = "a"; this.b = "b"; this.c = { a : "a+", b : () => { return this.a } } } console.log(new factory().c.b()) // "a"
執(zhí)行上面的代碼發(fā)現(xiàn),輸出的結(jié)果是“a”,這又是為什么呢?請看下圖所示
箭頭函數(shù)有幾個使用注意點
(1)函數(shù)體內(nèi)的this對象,就是定義時所在的對象,而不是使用時所在的對象。這個我們在上面的例子中也已經(jīng)見到過了,再舉一個比較常見的例子:
在涉及到setTimeout和setInterval時,我們之前的方法是在調(diào)用前將函數(shù)體內(nèi)的this通過賦值給一個變量的方法,使得能夠在setTimeout和setInterval的回調(diào)函數(shù)中使用函數(shù)體的this
function foo() { this.id = "111"; var _this = this; setTimeout(function () { console.log("id:", _this.id); }, 100); }
但是在ES6中在使用箭頭函數(shù)之后則不再需要進(jìn)行賦值替換而能直接使用函數(shù)體中的this
function foo() { this.id = "111"; setTimeout(()=>{ console.log(this.id); }, 100); }
this指向的固定化,并不是因為箭頭函數(shù)內(nèi)部有綁定this的機制,實際原因是箭頭函數(shù)根本沒有自己的this,導(dǎo)致內(nèi)部的this就是外層代碼塊的this。正是因為它沒有this,所以也就不能用作構(gòu)造函數(shù)。
除了this,以下三個變量在箭頭函數(shù)之中也是不存在的,指向外層函數(shù)的對應(yīng)變量:arguments、super、new.target。
(2)不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用new命令,否則會拋出一個錯誤。
(3)不可以使用arguments對象,該對象在函數(shù)體內(nèi)不存在。如果要用,可以用 rest 參數(shù)代替(下面會講解rest參數(shù))。
(4)不可以使用yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù),這部分在后面具體遇到時再進(jìn)行說明。
函數(shù)的默認(rèn)參數(shù)對于帶有參數(shù)的函數(shù),我們往往在一些情況下需要給出一個默認(rèn)值的設(shè)置,當(dāng)不傳入?yún)?shù)時,也能確保函數(shù)能夠正常執(zhí)行。在ES5中,我們的寫法往往如下:
function f(x, y, z) { if(y === undefined) { y = 7; } if(z === undefined) { z = 5; } return x + y + z } console.log(f(1,3));
在ES6中允許為函數(shù)的參數(shù)設(shè)置默認(rèn)值,即直接寫在參數(shù)定義的后面。
function f(x, y = 7, z = 5) { return x + y + z } console.log(f(1,3));
這段代碼和上面的執(zhí)行結(jié)果是一致的,可以看出函數(shù)默認(rèn)值的寫法使得函數(shù)定義更加的簡潔清晰。
ES6 的寫法還有兩個好處:
首先,閱讀代碼的人,可以立刻意識到哪些參數(shù)是可以省略的,不用查看函數(shù)體或文檔;
其次,有利于將來的代碼優(yōu)化,即使未來的版本在對外接口中,徹底拿掉這個參數(shù),也不會導(dǎo)致以前的代碼無法運行。
應(yīng)用另外,在上面的處理中,我們并沒有針對x的賦值進(jìn)行驗證,這樣當(dāng)在沒有給出x的值的時候,函數(shù)會導(dǎo)致報錯。這個時候,我們可以來寫一個非空驗證的方法,來給函數(shù)添加校驗。
function checkParameter() { throw new Error("can"t be empty") } function f(x = checkParameter(), y = 7, z = 5) { return x + y + z } console.log(f(1,3)); try{ f() } catch(e) { console.log(e) } finally { }
這樣給x設(shè)置默認(rèn)值的方式來執(zhí)行校驗函數(shù),就可以確認(rèn)x的賦值的有效性了。這也是函數(shù)默認(rèn)值的一種使用技巧。
rest參數(shù)上面針對參數(shù)默認(rèn)值做了說明,下面我們考慮一下一個概念,可變參數(shù),比如我們現(xiàn)在來做一個求和運算的函數(shù),但是是幾個數(shù)的求和是不一定的,按照ES5中的處理,我們的寫法:
function sum() { var array = Array.prototype.slice.call(arguments); // arguments對象不是數(shù)組,而是一個類似數(shù)組的對象。所以為了使用數(shù)組的方法,必須使用Array.prototype.slice.call先將其轉(zhuǎn)為數(shù)組。 var sum = 0; array.forEach(function(item){ sum += item * 1 }) return sum; } sum(1,2,3,4)
主要是通過arguments來獲取函數(shù)的參數(shù)列表來獲取參數(shù)。但是在ES6中卻并不需要這么麻煩,ES6 引入 rest 參數(shù)(形式為...變量名),用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對象了。rest 參數(shù)搭配的變量是一個數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。
function sum(...a) { var sum = 0; a.forEach(item => sum+= item*1) return sum; } sum(1,2,3,4)
通過ES6的rest參數(shù),能夠更加簡潔的來實現(xiàn)不定參數(shù)的函數(shù)的實現(xiàn)。rest參數(shù)是一個真正的數(shù)組,數(shù)組特有的方法都可以使用,完全比上面通過arguments的方法更加自然、簡潔。
注:rest參數(shù)之后不能再有其他參數(shù)(即只能是最后一個參數(shù))。
小結(jié)本次主要針對ES6中對于函數(shù)部分的相關(guān)擴展內(nèi)容作了梳理,并沒有非常的全面,而是選擇其中比較常用比較重要的箭頭函數(shù)、函數(shù)默認(rèn)值和rest參數(shù)這幾部分進(jìn)行了說明。更加細(xì)致的體會還是需要在后續(xù)的不斷使用中進(jìn)行加強和熟悉。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94174.html
摘要:前言在了解是如何編譯前,我們先看看的和的構(gòu)造函數(shù)是如何對應(yīng)的。這是它跟普通構(gòu)造函數(shù)的一個主要區(qū)別,后者不用也可以執(zhí)行。該函數(shù)的作用就是將函數(shù)數(shù)組中的方法添加到構(gòu)造函數(shù)或者構(gòu)造函數(shù)的原型中,最后返回這個構(gòu)造函數(shù)。 前言 在了解 Babel 是如何編譯 class 前,我們先看看 ES6 的 class 和 ES5 的構(gòu)造函數(shù)是如何對應(yīng)的。畢竟,ES6 的 class 可以看作一個語法糖,...
摘要:由兩部分組成模板起始符,稱為沉音符反引號,其內(nèi)容被識別為字符串模板。其實這是通過屬性操作中的結(jié)果,也就是說屬性將對控制符進(jìn)行轉(zhuǎn)義從而實現(xiàn)按照普通字符輸出。的語法是緊跟在后面,兩者間不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份發(fā)布,雖然各大瀏覽器仍未全面支持ES6,但我們可以在后端通過Node.js 0.12和io....
摘要:回顧我們先來回顧下箭頭函數(shù)的基本語法。主要區(qū)別包括沒有箭頭函數(shù)沒有,所以需要通過查找作用域鏈來確定的值。箭頭函數(shù)并沒有方法,不能被用作構(gòu)造函數(shù),如果通過的方式調(diào)用,會報錯。 回顧 我們先來回顧下箭頭函數(shù)的基本語法。 ES6 增加了箭頭函數(shù): let func = value => value; 相當(dāng)于: let func = function (value) { return ...
摘要:使用箭頭函數(shù)和構(gòu)造函數(shù)當(dāng)方法被調(diào)用時,會保留上下文。我們能使用這個特征用下面的方法在構(gòu)造函數(shù)中重定義函數(shù)。在調(diào)用方法的方使用函數(shù)綁定語法你也可以直接在非構(gòu)造函數(shù)里面的里面直接使用函數(shù)綁定。 這是React和ECMAScript6/ECMAScript7結(jié)合使用系列文章的第三篇。 下面是所有系列文章章節(jié)的鏈接: React 、 ES6 - 介紹(第一部分) React類、ES7屬性初始...
摘要:前言在閱讀入門的時候,零散的看到有私有變量的實現(xiàn),所以在此總結(jié)一篇。構(gòu)造函數(shù)應(yīng)該只做對象初始化的事情,現(xiàn)在為了實現(xiàn)私有變量,必須包含部分方法的實現(xiàn),代碼組織上略不清晰。 前言 在閱讀 《ECMAScript 6 入門》的時候,零散的看到有私有變量的實現(xiàn),所以在此總結(jié)一篇。 1. 約定 實現(xiàn) class Example { constructor() { this...
閱讀 1833·2023-04-26 02:32
閱讀 582·2021-11-18 13:12
閱讀 2461·2021-10-20 13:48
閱讀 2535·2021-10-14 09:43
閱讀 3845·2021-10-11 10:58
閱讀 3525·2021-09-30 10:00
閱讀 2946·2019-08-30 15:53
閱讀 3499·2019-08-30 15:53