国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS箭頭函數(shù)之:為何用?怎么用?何時(shí)用?

xushaojieaaa / 2994人閱讀

摘要:在現(xiàn)代中最讓人期待的特性就是關(guān)于箭頭函數(shù),用來標(biāo)識(shí)。比如,受歡迎的庫(kù)會(huì)強(qiáng)制使用箭頭函數(shù)創(chuàng)建匿名函數(shù)。然而,箭頭函數(shù)有優(yōu)點(diǎn),也有一些缺點(diǎn)。下面就從為何用怎么用何時(shí)用,這個(gè)三部分做一些總結(jié)。因此,箭頭函數(shù)不能用作生成器。

在現(xiàn)代JS中最讓人期待的特性就是關(guān)于箭頭函數(shù),用=>來標(biāo)識(shí)。箭頭函數(shù)有兩個(gè)主要的優(yōu)點(diǎn):

更簡(jiǎn)短的函數(shù);

更直觀的作用域和this的綁定(不綁定this)

因?yàn)檫@些優(yōu)點(diǎn),箭頭函數(shù)比起其他形式的函數(shù)聲明更受歡迎。比如,受歡迎的airbnb eslint configuration庫(kù)會(huì)強(qiáng)制使用JavaScript箭頭函數(shù)創(chuàng)建匿名函數(shù)。
然而,箭頭函數(shù)有優(yōu)點(diǎn),也有一些“缺點(diǎn)”。這就需要在使用的時(shí)候做一些權(quán)衡。下面就從為何用、怎么用、何時(shí)用,這個(gè)三部分做一些總結(jié)。

為何用?
引入箭頭函數(shù)有兩個(gè)方面的作用:更簡(jiǎn)短的函數(shù)并且不綁定this
更簡(jiǎn)短的函數(shù)
var elements = ["h1", "div", "span", "section"];

elements.map(function(el) {
  return el.length; // 返回?cái)?shù)組: [2, 3, 4, 7]
});

// 從上面的普通函數(shù)可以改寫為如下的箭頭函數(shù)
elements.map((el) => {
  return el.length; // [2, 3, 4, 7]
});

// 當(dāng)箭頭函數(shù)只有一個(gè)參數(shù)時(shí),可以省略參數(shù)的圓括號(hào)
elements.map(el => {
  return el.length; // [2, 3, 4, 7]
});

// 當(dāng)箭頭函數(shù)體只有一個(gè)`return`語句時(shí),可以省略`return`關(guān)鍵字和方法體的花括號(hào)
elements.map(el => el.length); // [2, 3, 4, 7]

// 在這個(gè)例子中,因?yàn)槲覀冎恍枰猔length`屬性,所以可以使用參數(shù)結(jié)構(gòu)
// 需要注意的是字符串`"length"`是我們想要獲得的屬性名稱,而`elLength`則只是個(gè)變量名,可以替換成任意合法的變量名
elements.map(({ "length": elLength }) => elLength); // [2, 3, 4, 7]
不綁定this

在箭頭函數(shù)出現(xiàn)之前,每個(gè)新定義的函數(shù)都有它自己的this值(在構(gòu)造函數(shù)的情況下是一個(gè)新對(duì)象,在嚴(yán)格模式的函數(shù)調(diào)用中則為undefined,如果該函數(shù)被作為"對(duì)象方法"調(diào)用則為基礎(chǔ)對(duì)象等)。
而箭頭函數(shù)并沒有它自己的執(zhí)行上下,實(shí)際上,這就意味著代碼中的thisarguments都是繼承它的父函數(shù)

const obj = {
  name: "test object",
  createAnonFunction: function() {
    return function() { 
      console.log(this.name);
      return this;
    }
  },
  createArrowFunction: function() {
    return () => {
      console.log(this.name);
      return this;
    }
  }
}

const anon = obj.createAnonFunction();
anon(); // undefined
anon() === window // true
  
const arrow = obj.createArrowFunction();
arrow(); // "test object"
arrow() === obj // true

第一個(gè)匿名參數(shù)有自己的上下文(指向的并非obj對(duì)象),當(dāng)被賦值給anon變量且調(diào)用時(shí),this發(fā)生了改變,指向了window。另一個(gè),箭頭函數(shù)與創(chuàng)建它的函數(shù)有相同的上下文,故指向obj對(duì)象。

通過call或者apply調(diào)用

由于箭頭函數(shù)沒有自己的this指針,通過call()或者apply()方法調(diào)用一個(gè)函數(shù)時(shí),只能傳遞參數(shù)(不能綁定this),它們的第一個(gè)參數(shù)會(huì)被忽略。

var adder = {
  base: 1,
  add: function(a) {
    var f = v => v + this.base;
    return f(a);
  },
  addByCall: function(a) {
    var f = v => v + this.base;
    var b = {
      base: 2
    };
    return f.call(b, a)
  }
}

adder.add(1); // 2
adder.addByCall(1); // 2
不綁定arguments

箭頭函數(shù)不綁定Arguments對(duì)象。因此,在本示例中,arguments只是引用了封閉作用域內(nèi)的arguments:

function foo(n) {
  var f = () => arguments[0] + n; // 隱式綁定 foo 函數(shù)的arguments對(duì)象,arguments[0]是 n
  return f(); 
}

foo(1); // 2

在大多數(shù)情況下,使用剩余參數(shù)是相對(duì)使用arguments對(duì)象的更好選擇。

function foo(arg) {
  var f = (...agrs) => args[0];
  return f(arg);
}
foo(1); // 1

function foo(arg1, arg2) {
  var f = (...args) => args[1];
  return f(arg1, arg2);
}
foo(1, 2); // 2
怎么用? 優(yōu)化代碼

比如你有一個(gè)有值的數(shù)組,你想去map遍歷每一項(xiàng),這時(shí)箭頭函數(shù)就非常推薦:

const words = ["hello", "WORLD", "Whatever"];
const downcasedWords = words.map(word => word.toLowerCase());

一個(gè)及其常見的例子就是返回一個(gè)對(duì)象的某個(gè)值:

const names = objects.map(object => object.name);

類似的,當(dāng)用forEach來替換傳統(tǒng)for循環(huán)的時(shí)候,實(shí)際上箭頭函數(shù)會(huì)直觀的保持this來自于父一級(jí):

this.examples.forEach(example => {
  this.runExample(example);
});
Promise和Promise鏈

當(dāng)在編寫異步編程時(shí),箭頭函數(shù)也會(huì)讓代碼更加直觀和簡(jiǎn)潔。
這是箭頭函數(shù)的理想位置,特別是如果您生成的函數(shù)是有狀態(tài)的,同時(shí)想引用對(duì)象中的某些內(nèi)容。

this.doSomethingAsync().then((result) => {
  this.storeResult(result);
});
對(duì)象轉(zhuǎn)換

箭頭函數(shù)的另一個(gè)常見而且十分有用的地方就是用于封裝的對(duì)象轉(zhuǎn)換。
例如在Vue.js中,有一種通用模式,就是使用mapStateVuex存儲(chǔ)的各個(gè)部分,直接包含到Vue組件中。
這涉及到定義一套mappers,用于從原對(duì)象到完整的轉(zhuǎn)換輸出,這在組件問題中實(shí)十分有必要的。這一系列簡(jiǎn)單的轉(zhuǎn)換,使用箭頭函數(shù)是最合適不過的。比如:

export default {
  computed: {
    ...mapState([
      "results",
      "users"
    ])
  }
}
何時(shí)用?(不推薦使用場(chǎng)景) 使用new操作符

箭頭函數(shù)不能用作構(gòu)造器,和new一起使用會(huì)拋出錯(cuò)誤。

var Foo = () => {};
var foo = new Foo(); // TypeError: Foo is not a constructor
使用prototype屬性

箭頭函數(shù)沒有prototype屬性。

var Foo = () => {};
console.log(Foo.prototype); // undefined
使用yield關(guān)鍵字

yield 關(guān)鍵字通常不能在箭頭函數(shù)中使用(除非是嵌套在允許使用的函數(shù)內(nèi))。因此,箭頭函數(shù)不能用作生成器。

深層調(diào)用

如果你將函數(shù)定義為箭頭函數(shù),并且在他們之間來回調(diào)用,當(dāng)你調(diào)試bug的時(shí)候你將被代碼困惑,甚至得到如下的錯(cuò)誤信息:

{anonymous}(){anonymous}(){anonymous}(){anonymous}(){anonymous}() //anonymous
常見錯(cuò)誤 返回對(duì)象字面量

記住用params => { object: literal }這種簡(jiǎn)單的語法返回對(duì)象字面量是行不通的。

var func = () => { foo: 1 };
func(); // undefined

var func = () => { foo: function() {} };   
// SyntaxError: function statement requires a name

這是因?yàn)榛ɡㄌ?hào){}里面的代碼被解析為一系列語句(即 foo 被認(rèn)為是一個(gè)標(biāo)簽,而非對(duì)象字面量的組成部分)。
所以,記得用圓括號(hào)把對(duì)象字面量包起來:

var func = () => ({foo: 1});
換行

箭頭函數(shù)在參數(shù)和箭頭之間不能換行。

var func = ()
           => 1; 
// SyntaxError: expected expression, got "=>"
解析順序

雖然箭頭函數(shù)中的箭頭不是運(yùn)算符,但箭頭函數(shù)具有與常規(guī)函數(shù)不同的特殊運(yùn)算符優(yōu)先級(jí)解析規(guī)則。

let callback;

callback = callback || function() {}; // ok

callback = callback || () => {};      
// SyntaxError: invalid arrow-function arguments

callback = callback || (() => {});    // ok
更多示例 使用三元運(yùn)算符
var foo = a => a > 15 ? 15 : a;

foo(10); // 10
foo(16); // 15
閉包
// 標(biāo)準(zhǔn)的閉包函數(shù)
function Add() {
  var i = 0;
  return function() {
    return (++i);
  }
}

var add = Add();
add(); // 1
add(); // 2

// 箭頭函數(shù)體的閉包(i = 0是默認(rèn)參數(shù))
var Add = (i = 0) => { return (() => (++i)) };
var add = Add();
add(); // 1
add(); // 2

// 因?yàn)閮H有一個(gè)返回,return及括號(hào)也可以省略
var Add = (i = 0) => () => (++i);
箭頭函數(shù)遞歸
var fact = (x) => ( x == 0 ?  1 : x*fact(x-1) );
fact(5);       // 120
總結(jié)

箭頭函數(shù)是JS語言中十分特別的屬性,并且使很多情形中代碼更加的變化莫測(cè)。盡管如此,就像其他的語言特性,他們有各自的優(yōu)缺點(diǎn)。因此我們使用它應(yīng)該僅僅是作為一種工具,而不是無腦的簡(jiǎn)單的全部替換為箭頭函數(shù)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/110033.html

相關(guān)文章

  • 記錄一次杭州順網(wǎng)科技的面試過程

    摘要:以上是面試中筆試涉及到的知識(shí)點(diǎn)或者后面被問到的只是點(diǎn)。也許是根據(jù)薪資和面試的等級(jí)來出題的。我剛面試完回家,吃了一個(gè)泡面,回憶下面試題。同時(shí)作為傳遞到構(gòu)造函數(shù),執(zhí)行了一次讓構(gòu)造函數(shù)里面的屬性和方法賦值了一份給。 css 如何水平垂直居中,請(qǐng)盡量多說幾種方法?很尷尬,我多次面試都被問到這個(gè)問題,fuck 定位(回答了)、table-cell布局、flex布局、translate+relat...

    shiguibiao 評(píng)論0 收藏0
  • 記錄一次杭州順網(wǎng)科技的面試過程

    摘要:以上是面試中筆試涉及到的知識(shí)點(diǎn)或者后面被問到的只是點(diǎn)。也許是根據(jù)薪資和面試的等級(jí)來出題的。我剛面試完回家,吃了一個(gè)泡面,回憶下面試題。同時(shí)作為傳遞到構(gòu)造函數(shù),執(zhí)行了一次讓構(gòu)造函數(shù)里面的屬性和方法賦值了一份給。 css 如何水平垂直居中,請(qǐng)盡量多說幾種方法?很尷尬,我多次面試都被問到這個(gè)問題,fuck 定位(回答了)、table-cell布局、flex布局、translate+relat...

    caiyongji 評(píng)論0 收藏0
  • 前端每周清單第 41 期 : Node 與 Rust、OpenCV 的火花,網(wǎng)絡(luò)安全二三事

    摘要:的網(wǎng)站仍然使用有漏洞庫(kù)上周發(fā)布了開源社區(qū)安全現(xiàn)狀報(bào)告,發(fā)現(xiàn)隨著開源社區(qū)的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴(kuò)大。與應(yīng)用安全是流行的服務(wù)端框架,本文即是介紹如何使用以及其他的框架來增強(qiáng)應(yīng)用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...

    syoya 評(píng)論0 收藏0
  • 前端知識(shí)點(diǎn)總結(jié)——JS高級(jí)(持續(xù)更新中)

    摘要:前端知識(shí)點(diǎn)總結(jié)高級(jí)持續(xù)更新中字符串什么是連續(xù)存儲(chǔ)多個(gè)字符的字符數(shù)組相同下標(biāo)遍歷選取不同類型不同不通用所有字符串都無權(quán)修改原字符串,總是返回新字符串大小寫轉(zhuǎn)換統(tǒng)一轉(zhuǎn)大寫統(tǒng)一轉(zhuǎn)小寫何時(shí)不區(qū)分大小寫時(shí),都需要先轉(zhuǎn)為一致的大小寫,再比較。 前端知識(shí)點(diǎn)總結(jié)——JS高級(jí)(持續(xù)更新中) 1.字符串 什么是: 連續(xù)存儲(chǔ)多個(gè)字符的字符數(shù)組 相同: 1. 下標(biāo) 2. .length 3. 遍歷 4....

    wangzy2019 評(píng)論0 收藏0
  • 從use strict看JS(一):this與箭頭函數(shù)

    摘要:其次,指向有一個(gè)好處,構(gòu)造函數(shù)一般不要直接運(yùn)行,那要是強(qiáng)行運(yùn)行呢指向會(huì)給添加許多屬性,有擾亂命名空間之嫌,指向之后,你強(qiáng)行運(yùn)行我就強(qiáng)行報(bào)錯(cuò)會(huì)給增加屬性,改成嚴(yán)格模式就會(huì)當(dāng)然,不能解決所有問題,所以有了箭頭函數(shù)參考嚴(yán)格模式詳解 上github看原文:點(diǎn)一下 系列 一日,見use strict,冥想許久…… 系列列表:從use strict看JS(一):this與箭頭函數(shù)從use stri...

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

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

0條評(píng)論

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