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

資訊專欄INFORMATION COLUMN

【ES6系列】函數(shù)部分

enda / 2296人閱讀

摘要:正是因為它沒有,所以也就不能用作構(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

相關(guān)文章

  • ES6 系列之 Babel 是如何編譯 Class 的(上)

    摘要:前言在了解是如何編譯前,我們先看看的和的構(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 可以看作一個語法糖,...

    shadajin 評論0 收藏0
  • ES6 Features系列:Template Strings & Tagged Templ

    摘要:由兩部分組成模板起始符,稱為沉音符反引號,其內(nèi)容被識別為字符串模板。其實這是通過屬性操作中的結(jié)果,也就是說屬性將對控制符進(jìn)行轉(zhuǎn)義從而實現(xiàn)按照普通字符輸出。的語法是緊跟在后面,兩者間不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份發(fā)布,雖然各大瀏覽器仍未全面支持ES6,但我們可以在后端通過Node.js 0.12和io....

    MyFaith 評論0 收藏0
  • ES6 系列之箭頭函數(shù)

    摘要:回顧我們先來回顧下箭頭函數(shù)的基本語法。主要區(qū)別包括沒有箭頭函數(shù)沒有,所以需要通過查找作用域鏈來確定的值。箭頭函數(shù)并沒有方法,不能被用作構(gòu)造函數(shù),如果通過的方式調(diào)用,會報錯。 回顧 我們先來回顧下箭頭函數(shù)的基本語法。 ES6 增加了箭頭函數(shù): let func = value => value; 相當(dāng)于: let func = function (value) { return ...

    hsluoyz 評論0 收藏0
  • React類,方法綁定(第三部分

    摘要:使用箭頭函數(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屬性初始...

    livem 評論0 收藏0
  • ES6 系列之私有變量的實現(xiàn)

    摘要:前言在閱讀入門的時候,零散的看到有私有變量的實現(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...

    lentoo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<