国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 web前端 前端問答 es6中箭頭函數和普通函數的差別是什麼

es6中箭頭函數和普通函數的差別是什麼

Mar 08, 2022 pm 12:11 PM
javascript es6 箭頭函數 普通函數

區(qū)別:1、箭頭函數的定義要比普通函數定義簡潔、清晰得多,很快捷;2、箭頭函數不會創(chuàng)建自己的this,而普通函數會;3、箭頭函數不能作為建構函式使用,而箭頭函式能作為建構函式使用;4、箭頭函式沒有自己的arguments,而箭頭函式有。

es6中箭頭函數和普通函數的差別是什麼

本教學操作環(huán)境:windows7系統、ECMAScript 6版、Dell G3電腦。

箭頭函數是前端面試環(huán)節(jié)的高頻考點,箭頭函數是ES6的API,相信很多人都知道,因為它的語法比一般的函數更簡潔,所以深受大家的喜愛。

一、基本語法

ES6中允許使用箭頭=>來定義箭頭函數,具體語法,我們來看一個簡單的例子:

// 箭頭函數
let fun = (name) => {
    // 函數體
    return `Hello ${name} !`;
};

// 等同于
let fun = function (name) {
    // 函數體
    return `Hello ${name} !`;
};

可以看出,定義箭頭函在數語法上比普通函數簡潔得多。箭頭函數省去了function關鍵字,採用箭頭=>定義函數。函數的參數放在=>前面的括號中,函數體跟在=>後面的花括號中。

關於箭頭函數的參數:

如果箭頭函數沒有參數,直接寫一個空括號即可。

如果箭頭函數的參數只有一個,也可以省去包裹參數的括號。

若箭頭函數有多個參數,將參數依序以逗號(,)分隔,包裹在括號中即可。

// 沒有參數
let fun1 = () => {
    console.log(111);
};

// 只有一個參數,可以省去參數括號
let fun2 = name => {
    console.log(`Hello ${name} !`)
};

// 有多個參數
let fun3 = (val1, val2, val3) => {
    return [val1, val2, val3];
};

關於箭頭函數的函數體:

如果箭頭函數的函數體只有一句程式碼,就是簡單回傳某個變數或傳回一個簡單的JS表達式,可以省去函數體的大括號{ }。

let f = val => val;
// 等同于
let f = function (val) { return val };

let sum = (num1, num2) => num1 + num2;
// 等同于
let sum = function(num1, num2) {
  return num1 + num2;
};

如果箭頭函數的函數體只有一句程式碼,就是回傳一個對象,可以像下面這樣寫:

// 用小括號包裹要返回的對象,不報錯
let getTempItem = id => ({ id: id, name: "Temp" });

// 但絕不能這樣寫,會報錯。
// 因為對象的大括號會被解釋為函數體的大括號
let getTempItem = id => { id: id, name: "Temp" };

如果箭頭函數的函數體只有一條語句且不需要傳回值(最常見是呼叫一個函數),可以在這條語句前面加上一個void關鍵字

let fn = () => void doesNotReturn();

箭頭函數最常見的用處就是簡化回呼函數。

// 例子一
// 正常函數寫法
[1,2,3].map(function (x) {
  return x * x;
});

// 箭頭函數寫法
[1,2,3].map(x => x * x);

// 例子二
// 正常函數寫法
var result = [2, 5, 1, 4, 3].sort(function (a, b) {
  return a - b;
});

// 箭頭函數寫法
var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);

二、箭頭函數與普通函數的差異

#1、語法更簡潔、清晰

從上面的基本語法範例可以看出,箭頭函數的定義比普通函數定義簡潔、清晰得多,而且很快捷。

2、箭頭函數不會創(chuàng)建自己的this(重要!!深入理解?。。?/strong>

我們先來看看MDN上對箭頭函數 this的解釋。

箭頭函數不會創(chuàng)建自己的this,所以它沒有自己的this,它只會從自己的作用域鏈的上一層繼承this。

箭頭函數沒有自己的this,它會捕捉自己在定義時(注意,是定義時,不是呼叫時)所處的外層執(zhí)行環(huán)境的this,並繼承這個this值。所以,箭頭函數中this的指向在它被定義的時候就已經確定了,之後永遠不會改變。

來看個例子:

var id = 'Global';

function fun1() {
    // setTimeout中使用普通函數
    setTimeout(function(){
        console.log(this.id);
    }, 2000);
}

function fun2() {
    // setTimeout中使用箭頭函數
    setTimeout(() => {
        console.log(this.id);
    }, 2000)
}

fun1.call({id: 'Obj'});     // 'Global'

fun2.call({id: 'Obj'});     // 'Obj'

上面這個例子,函數fun1中的setTimeout中使用普通函數,2秒後函數執(zhí)行時,這時函數其實是在全域作用域執(zhí)行的,所以this指向Window對象,this.id就指向全域變數id,所以輸出'Global'。 但是函數fun2中的setTimeout中使用的是箭頭函數,這個箭頭函數的this在定義時就確定了,它繼承了它外層fun2的執(zhí)行環(huán)境中的this,而fun2呼叫時thiscall方法改變到了物件{id: 'Obj'}中,所以輸出'Obj'。

再來看另一個例子:

var id = 'GLOBAL';
var obj = {
  id: 'OBJ',
  a: function(){
    console.log(this.id);
  },
  b: () => {
    console.log(this.id);
  }
};

obj.a();    // 'OBJ'
obj.b();    // 'GLOBAL'

上面這個例子,物件obj的方法a使用普通函數定義的,普通函數作為物件的方法呼叫時,this指向它所屬的物件。所以,this.id就是obj.id,所以輸出'OBJ'。 但是方法b是使用箭頭函數定義的,箭頭函數中的this實際上是繼承的它定義時所處的全域執(zhí)行環(huán)境中的this,所以指向Window對象,所以輸出'GLOBAL'。 (這裡要注意,定義物件的大括號{}是無法形成一個單獨的執(zhí)行環(huán)境的,它依舊是處於全域執(zhí)行環(huán)境中?。?/strong>)

3、箭頭函數繼承而來的this指向永遠不變(重要??!深入理解?。。?/strong>

上面的例子,就完全可以說明箭頭函數繼承而來的this指向永遠不變。對象obj的方法b是使用箭頭函數定義的,這個函數中的this永遠指向它定義時所處的全局執(zhí)行環(huán)境中的this,即便這個函數是作為對象obj的方法調用,this依舊指向Window對象。

4、.call()/.apply()/.bind()無法改變箭頭函數中this的指向

.call()/.apply()/.bind()方法可以用來動態(tài)修改函數執(zhí)行時this的指向,但由于箭頭函數的this定義時就已經確定且永遠不會改變。所以使用這些方法永遠也改變不了箭頭函數this的指向,雖然這么做代碼不會報錯。

var id = 'Global';
// 箭頭函數定義在全局作用域
let fun1 = () => {
    console.log(this.id)
};

fun1();     // 'Global'
// this的指向不會改變,永遠指向Window對象
fun1.call({id: 'Obj'});     // 'Global'
fun1.apply({id: 'Obj'});    // 'Global'
fun1.bind({id: 'Obj'})();   // 'Global'

5、箭頭函數不能作為構造函數使用

我們先了解一下構造函數的new都做了些什么?簡單來說,分為四步: ① JS內部首先會先生成一個對象; ② 再把函數中的this指向該對象; ③ 然后執(zhí)行構造函數中的語句; ④ 最終返回該對象實例。

但是??!因為箭頭函數沒有自己的this,它的this其實是繼承了外層執(zhí)行環(huán)境中的this,且this指向永遠不會隨在哪里調用、被誰調用而改變,所以箭頭函數不能作為構造函數使用,或者說構造函數不能定義成箭頭函數,否則用new調用時會報錯!

let Fun = (name, age) => {
    this.name = name;
    this.age = age;
};

// 報錯
let p = new Fun('cao', 24);

6、箭頭函數沒有自己的arguments

箭頭函數沒有自己的arguments對象。在箭頭函數中訪問arguments實際上獲得的是外層局部(函數)執(zhí)行環(huán)境中的值。

// 例子一
let fun = (val) => {
    console.log(val);   // 111
    // 下面一行會報錯
    // Uncaught ReferenceError: arguments is not defined
    // 因為外層全局環(huán)境沒有arguments對象
    console.log(arguments); 
};
fun(111);

// 例子二
function outer(val1, val2) {
    let argOut = arguments;
    console.log(argOut);    // ①
    let fun = () => {
        let argIn = arguments;
        console.log(argIn);     // ②
        console.log(argOut === argIn);  // ③
    };
    fun();
}
outer(111, 222);

上面例子二,①②③處的輸出結果如下:

es6中箭頭函數和普通函數的差別是什麼

很明顯,普通函數outer內部的箭頭函數fun中的arguments對象,其實是沿作用域鏈向上訪問的外層outer函數的arguments對象。

可以在箭頭函數中使用rest參數代替arguments對象,來訪問箭頭函數的參數列表??!

7、箭頭函數沒有原型prototype

let sayHi = () => {
    console.log('Hello World !')
};
console.log(sayHi.prototype); // undefined

8、箭頭函數不能用作Generator函數,不能使用yeild關鍵字

【相關推薦:javascript視頻教程、web前端

以上是es6中箭頭函數和普通函數的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
WebSocket與JavaScript:實現即時監(jiān)控系統的關鍵技術 WebSocket與JavaScript:實現即時監(jiān)控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監(jiān)控系統的關鍵技術引言:隨著互聯網技術的快速發(fā)展,即時監(jiān)控系統在各個領域中得到了廣泛的應用。而實現即時監(jiān)控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監(jiān)控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發(fā)展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平臺的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發(fā)展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業(yè)務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

簡易JavaScript教學:取得HTTP狀態(tài)碼的方法 簡易JavaScript教學:取得HTTP狀態(tài)碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態(tài)碼,需要具體程式碼範例前言:在Web開發(fā)中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態(tài)碼來判斷操作是否成功,並根據不同的狀態(tài)碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態(tài)碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節(jié)點。這個方法需要兩個參數:要插入的新節(jié)點和參考節(jié)點(即新節(jié)點將要插入的位置的節(jié)點)。

如何在JavaScript中取得HTTP狀態(tài)碼的簡單方法 如何在JavaScript中取得HTTP狀態(tài)碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態(tài)碼取得方法簡介:在進行前端開發(fā)中,我們常常需要處理與後端介面的交互,而HTTP狀態(tài)碼就是其中非常重要的一部分。了解並取得HTTP狀態(tài)碼有助於我們更好地處理介面?zhèn)骰氐馁Y料。本文將介紹使用JavaScript取得HTTP狀態(tài)碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態(tài)碼HTTP狀態(tài)碼是指當瀏覽器向伺服器發(fā)起請求時,服務

See all articles