ES6-7 - 箭頭函數的實質、箭頭函數的使用場景

箭頭函數返回對象

// 這種情況要要用(),否則會將對象的{}解釋為塊
const fn = (a, b) => ({a:1, b:2})

箭頭函數的特點

  1. this指向由外層函數的作用域來決定,它本身沒有this,不能通過call、apply、bind改變
  2. 不能作為構造函數使用
  3. 不可以使用arguments對象,該對象在函數體內不存在,可用rest代替
  4. 不可以使用yield命令,因此箭頭函數不能用作 Generator 函數。
function foo() {console.log('this', this)return (a) => {console.log('a', this.a)}
}
var obj1 = { a: 2 };
var obj2 = { a: 3 };
var bar = foo.call(obj1)
bar.call(obj2) // 2
  • 所有的內層函數都是箭頭函數,都沒有自己的this,它們的this其實都是最外層foo函數的this。
function foo() {return () => {return () => {return () => {console.log('id:', this.id);};};};
}var f = foo.call({id: 1}); // foo是普通函數,可以通過call改變this指向var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1

定義對象的方法

  • 定義對象的方法,且該方法內部包括this且該方法內部包括this,不應使用箭頭函數定義
const p = {eat: function () {console.log('this-eat', this)},sleep: () => {console.log('this-window', this)}
}
p.eat() // p
p.sleep() // window 
  • 以下例子bind與箭頭函數都能讓this指向實例
    在這里插入圖片描述

arguments

function foo() {const a = () => {console.log(arguments)}a()
}
foo(1, 2, 3, 4) // [1,2,3,4] 箭頭函數內無arguments,取外層的
function foo() {setTimeout(() => {console.log(arguments)})
}
foo(1, 2, 3, 4) // [1,2,3,4]  箭頭函數內無arguments,取外層的

嵌套的箭頭函數

// 非常語義化
function insert(value) {return {into: function (array) {return {after: function (afterValue) {array.splice(array.indexOf(afterValue) + 1, 0, value);return array;}};}};
}insert(2).into([1, 3]).after(1); //[1, 2, 3]
// 改寫為箭頭函數,效果相同但是可讀性差
let insert = (value) => ({into: (array) => ({after: (afterValue) => {array.splice(array.indexOf(afterValue) + 1, 0, value);return array;
}})});insert(2).into([1, 3]).after(1); //[1, 2, 3]

應用場景

  1. 簡單的函數表達式,內部沒有this引用,沒有遞歸,事件綁定,解綁定
  2. 內層函數表達式,需要調用this,且this應與外層函數一致時(保證指向vue實例)
const sortArr = (...nums) => nums.sort((a, b) => a - b)
console.log(sortArr(5, 4, 1, 10)) // [1, 4, 5, 10]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251025.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mybatis比hibernate處理速度快的原因

mybatis:是面向結果集的。當要展示的頁面需要幾個字段時,springmvc會提供這幾個字段并將其拼接成結果集,在轉化為相應的對象。 hibernate:是面向對象的。要展示的頁面需要某些字段時,會將所有字段都查出來,在轉化為相應…

zabbix 從入門到精通

https://www.cnblogs.com/clsn/p/7885990.html 轉載于:https://www.cnblogs.com/learningJAVA/p/8376589.html

javasript --- 一個日期規范(x秒前,x分前...)

Time函數(通俗易懂,自己根據實際需求修改吧- -) // time.js var Time {// 獲取當前時間戳getUnix: function () {var date new Date();return date.getTime();},// 獲取今天0點0分0秒的時間戳getTodayUnix: function () {var date new Date();date.setHours(0);date.setMin…

ES6-8 - 函數名/對象拓展、描述符、getter/setter

函數名 有兩種特殊情況:bind方法創造的函數,name屬性返回bound加上原函數的名字;Function構造函數創造的函數,name屬性返回anonymous。 bind函數名 // 以bound開頭 function foo() { } const fnName foo.bind().name console.lo…

javascript --- 再識閉包

看下面一個例子: function zipCode(code, location) {let _code code;let _location location || ;return {code: function () {return _code;},location: function() {return _location;}} }再上述封閉的函數中,code的匿名函數根據作用域鏈可以訪問到外面的_code變量. con…

iframe.contentWindow介紹

一、在使用iframe的頁面,要操作這個iframe里面的DOM元素可以用: contentWindow、contentDocument(測試的時候chrome瀏覽器,要在服務器環境下) 1、先獲取iframe里面的window對象,再通過這個對象,獲取到里面的DOM元素 例…

ES6-9 對象密封4種方式、assign、取值函數的拷貝

一 對象密封 1 Object.preventExtensions 禁止對象拓展,仍可刪除 嚴格模式下報錯 const origin {a: 1 } const fixed Object.preventExtensions(origin) console.log(origin fixed) // true console.log(Object.isExtensible(origin)) // false 不可拓展 orig…

MySQL入門命令

我主要是在維護OpenStack云平臺的時候會涉及MySQL數據庫的操作,這里就跟大家分享一下常用的簡單命令,也為自己做個小練習。 1.登錄MySQL數據庫 mysql -h localhost -u root -p 123456 其中,-h:mysql服務器的IP地址或主機名&#x…

【模板】分塊

題意簡述 已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.求出某區間每一個數的和 題解思路 對于一個長度為n的序列,我們可以講其中的元素分為\( \sqrt{n} \) 個連續的子序列,每塊的長度自然就為\( \sqrt{n} \)…

javascript --- 使用ajax與服務器進行通信

Ajax: (Asynchronous JavaScript and XML,異步JavaScript與XML技術)是一種有效利用JavaScript和DOM的操作. 與傳統HTTP請求的區別: Ajax允許只更新頁面的一部分,因此減少了響應中傳輸的數據量 Ajax的API: Ajax與服務器進行通信,可以使用JavaScript中原生的XMLHttpRequest對象…

ES6-10 super、4種遍歷方式、原型、symbol遍歷

由于現代 JavaScript 引擎優化屬性訪問所帶來的特性的關系,更改對象的 [[Prototype]]即__proto__在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作。 一 Object原型方法 1 Object.setPrototypeOf(obj, proto) 用該方法而不是直接修改__proto__返回值是設置好原…

IntelliJ IDEA使用

1:下載 ideaIU-2017.2.exe,JetbrainsCrack-2.6.2.jar(補丁) 2:安裝ideaIU-2017.2.exe,將補丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目錄下 3:在安裝的idea下面的bin目錄下面有2個文件 : 一個是id…

js中如何刪除json對象的某一個選項

我有一個這樣一個對象,getData, 但是我不想要每一項的id,那怎么去刪除呢(使用delete)? getData.map((item) >{delete item["id"];});console.log(getData);轉載于:https://www.cnblogs.com/mmykdbc/p/8386407.html

ES6-11 Symbol、iterator、forOf、typeArray

…剩余運算符 const obj1 {a: 1,b: 2 } const obj2 {a: 100,b: 2,c: 300 } const obj {...obj1,...obj2 } console.log(obj) // 和Object.assign(obj, obj1, obj2)結果相同[Symbol.hasInstance] Symbol構造函數上的屬性,默認調用了方法 iterator迭代器 對數…

node --- 游走在客戶端和服務器間的http

本篇文章,講述了一個很簡單的上傳圖片(/start)到本地服務器,然后路由跳轉到/upload. 寫這個程序的目的是為了幫助理解HTTP的一些基本概念及node對于http api的實現以及程序的設計模式. IP: 計算機之間的通信 TCP: 應用程序之間的通信 HTTP: 基于TCP實現的應用層協議,設計之初是…

BigDecimal踩過的大坑

通常Java中涉及金錢相關的計算為了保持精度,會采用BigDecimal來實現,但是BigDecimal中創建BigDecimal類對象的時候,如果使用直接new的話,必須是String類型的參數,否則會導致創建出來的對象不是你想要的,比如…

redis配置環境變量

直接上圖不解釋 redis安裝路徑,我的電腦右擊屬性 窗口R鍵,輸入cmd回車,輸入redis-server.exe 回車 再開一個命令窗口,窗口R鍵,輸入cmd回車,輸入 redis-cli.exe -h 127.0.0.1 -p 6379 回車 轉載于:https:/…

對轉義字符的思考

ASCII碼 計算機存儲文字時用的是二進制,ASCII碼就是一張對照表,什么字符對應什么碼,將二進制碼存儲下來0-127位表示基礎的ASCII碼0-31,和127表示非打印控制字符(如換行、回車、響鈴、文頭、文尾)32-126表示…

進程總結

進程總結 進程: 正在進行的一個過程或者說一個任務 進程是計算機中資源分配的最小單位 多進程之間的數據是隔離的 多進程是用來解決高計算型的程序用的 啟動進程的開銷比較大,其開啟數量和cpu的個數相關,正常在cpu的個數1-2倍之間 進程越多&a…

debian如何安裝Let's Encrypt

如果python默認版本不是2,刪除 /usr/bin/python 添加軟引用 in -s /usr/bin/python2 /usr/bin/python 第一步,卸載virtualenv apt-get purge python-virtualenv python3-virtualenv virtualenv 如果pip沒有就安裝pip apt-get install python-pip pip …