面試題之箭頭函數和普通函數有什么區別?

箭頭函數(Arrow Function)和普通函數(Regular Function)是 JavaScript 中兩種不同的函數定義方式,它們在語法、上下文(this)、原型鏈等方面存在顯著區別。以下是它們的主要區別:


1. 語法差異

  • 普通函數:

    function normalFunction(a, b) {return a + b;
    }

    或者使用函數表達式:

    const normalFunction = function(a, b) {return a + b;
    };
  • 箭頭函數:

    const arrowFunction = (a, b) => {return a + b;
    };

    如果箭頭函數體只有一條語句,可以省略大括號并自動返回結果:

    const arrowFunction = (a, b) => a + b;

2. this 的處理方式

這是箭頭函數和普通函數最重要的區別之一。

  • 普通函數:

    • 普通函數的 this 是動態綁定的,取決于函數的調用方式:

      • 作為方法調用: this 指向調用它的對象。

        const obj = {
        ? ? name: "Kimi",
        ? ? greet: function() {
        ? ? ? ? console.log(this.name); // 輸出 "Kimi"
        ? ? }
        };
        obj.greet();

      • 作為普通函數調用: this 指向全局對象(非嚴格模式下是 windowglobal,嚴格模式下是 undefined)。


        function greet() {
        ? ? console.log(this);
        }
        greet(); // 非嚴格模式下輸出 window,嚴格模式下輸出 undefined

      • 使用 callapplybind: 可以手動綁定 this

        greet.call({ name: "Kimi" }); // 輸出 { name: "Kimi" }
  • 箭頭函數:

    • 箭頭函數沒有自己的 this,它會捕獲其所在上下文的 this 值,并在函數內部使用。

    • 箭頭函數的 this 是在定義時就確定的,不會隨著調用方式改變。

    const obj = {
    ? ? name: "Kimi",
    ? ? greet: () => {
    ? ? ? ? console.log(this.name); // 輸出 undefined(因為箭頭函數捕獲了全局上下文的 this)
    ? ? }
    };
    obj.greet();

    const normalGreet = function() {
    ? ? console.log(this.name); // 輸出 "Kimi"
    };
    const arrowGreet = () => {
    ? ? console.log(this.name); // 輸出 undefined
    };

    normalGreet.call({ name: "Kimi" }); // 輸出 "Kimi"
    arrowGreet.call({ name: "Kimi" }); // 輸出 undefined


3. arguments 對象

  • 普通函數:

    • 普通函數內部可以訪問 arguments 對象,它是一個類數組對象,包含函數調用時傳入的所有參數。

    function sum() {
    ? ? console.log(arguments); // 類數組對象,包含所有參數
    ? ? return Array.from(arguments).reduce((a, b) => a + b, 0);
    }
    console.log(sum(1, 2, 3)); // 輸出 6

  • 箭頭函數:

    • 箭頭函數不綁定自己的 arguments 對象,只能通過參數名訪問參數。

    const sum = (...args) => {
    ? ? console.log(arguments);? // ReferenceError: arguments is not defined
    ? ? return args.reduce((a, b) => a + b, 0);
    };
    console.log(sum(1, 2, 3)); // 輸出 6


4. new 調用

  • 普通函數:

    • 普通函數可以用 new 關鍵字創建一個新的實例對象。

    function Person(name) {
    ? ? this.name = name;
    }
    const person = new Person("Kimi");
    console.log(person); // 輸出 { name: "Kimi" }

  • 箭頭函數:

    • 箭頭函數不能用 new 關鍵字調用,否則會拋出錯誤。

    const Person = (name) => {
    ? ? this.name = name;
    };
    const person = new Person("Kimi"); // TypeError: Person is not a constructor


5. 原型鏈

  • 普通函數:

    • 普通函數有 prototype 屬性,可以用于原型鏈繼承。

    function Person(name) {
    ? ? this.name = name;
    }
    Person.prototype.greet = function() {
    ? ? console.log(`Hello, my name is ${this.name}`);
    };
    const person = new Person("Kimi");
    person.greet(); // 輸出 "Hello, my name is Kimi"

  • 箭頭函數:

    • 箭頭函數沒有 prototype 屬性,因此不能用于原型鏈繼承。

    const Person = (name) => {
    ? ? this.name = name;
    };
    console.log(Person.prototype); // undefined


6. 使用場景

  • 普通函數:

    • 適用于需要動態綁定 this 的場景,例如作為方法調用、事件處理器、構造函數等。

    • 適用于需要訪問 arguments 對象的場景。

  • 箭頭函數:

    • 適用于不需要動態綁定 this 的場景,例如回調函數、匿名函數等。

    • 適用于需要簡潔語法的場景,尤其是只有一條語句時。


總結

  • 普通函數:

    • 有自己的 this,動態綁定。

    • arguments 對象。

    • 可以用 new 調用。

    • prototype 屬性。

    • 語法稍顯復雜。

  • 箭頭函數:

    • 沒有自己的 this,捕獲定義時的上下文。

    • 沒有 arguments 對象。

    • 不能用 new 調用。

    • 沒有 prototype 屬性。

    • 語法簡潔。

根據實際需求選擇合適的函數類型可以提高代碼的可讀性和效率。

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

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

相關文章

Llama 3.1 本地電腦部署 Linux系統 【輕松簡易】

本文分享在自己的本地電腦部署 llama3.1,而且輕松簡易,快速上手。 這里借助Ollama工具,在Linux系統中進行大模型部署~ Llama3.1,有三個版本:8B、70B、405B Llama 3.1 405B 是第一個公開可用的模型,在常識…

工業安全的智能哨兵:AI如何筑起生產線的“數字防火墻“

工業安全的智能哨兵:AI如何筑起生產線的"數字防火墻" (本文共1420字,閱讀約需4分鐘) 去年某石化廠的反應釜壓力數據出現異常波動,傳統監測系統在15分鐘后才發出警報——而AI模型在23秒前就已預警。這場未遂事故揭示了一個殘酷現實:工業安全監測正在經歷從&qu…

【Bert】自然語言(Language Model)入門之---Bert

every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 對bert進行梳理 論文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 時間:…

Linux中使用Docker安裝DIFY搭建本地支持庫和Agent

Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務(Backend as Service)和 LLMOps 的理念,使開發者可以快速搭建生產級的生成式 AI 應用。即使你是非技術人員,也能參與到 AI 應用的定義和數據運營過程中。 然而…

開源工具推薦--思維導圖、流程圖等繪制

1. 前言 在工作中,經常要用到各種不同的工具,隨著系統的升級,有些工具也在不斷更新升級。這里收集整理一些好用的開源工具推薦,遵循以下一些基本原則:開源免費,商業工具的有效平替,輕量級&…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_create_pool函數

ngx_create_pool 聲明在 src\core\ngx_palloc.h 中 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); 實現在 src\core\ngx_palloc.c 中 ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p ngx_memalign(NGX_POOL_ALIGNMENT, size, lo…

ac的dhcp池里option43配錯導致ap無法上線問題排查過程

dhcp池里ac地址配錯,導致ap無法上線問題排查過程 問題:ap手動設置ac的ip正常注冊在線,但dhcp獲得ip和ac地址發現無法在ac上注冊成功。 組網: ac旁路結構,路由器lan口地址172.16.1.1,開dhcp服務&#xff0…

IntelliJ IDEA中Maven配置全指南

一、環境準備與基礎配置 1.1 Windows 環境下載并配置 Maven 見此篇博文:環境配置 1.2 IDEA配置步驟 打開設置面板:File → Settings → Build → Build Tools → Maven 關鍵配置項: Maven home path E:\apache-maven-3.9.9 (…

存儲區域網絡(SAN)管理

存儲區域網絡(Storage Area Network,SAN)采用網狀通道(Fibre Channel ,簡稱FC)技術,通過FC交換機連接存儲陣列和服務器主機,建立專用于數據存儲的區域網絡。SAN提供了一種與現有LAN連…

使用vue-office報錯TypeError: ft.createElementVNode is not a function

支持多種文件(.docx、.xlsx、.xls、.pdf、.pptx)預覽的vue組件庫,支持vue2/3。也支持非Vue框架的預覽。 不支持.doc、.ppt(2003年及以前的版本) 官網:https://www.npmjs.com/package/vue-office/excel?activeTabreadme 官方有實…

Ubuntu部署ktransformers

準備工作 一臺服務器 CPU:500G GPU:48G(NVIDIA4090) 系統:Ubuntu20.04(github的文檔好像用的是22.04) 第一步:下載權重文件 1.下載hfd wget https://hf-mirror.com/hfd/hfd.s…

C++初階——簡單實現vector

目錄 1、前言 2、Vector.h 3、Test.cpp 1、前言 簡單實現std::vector類模板。 相較于前面的string,vector要注意: 深拷貝,因為vector的元素可能是類類型,類類型元素可以通過賦值重載,自己實現深拷貝。 迭代器失效…

全志A133 android10 適配SLM770A 4G模塊

一,模塊基本信息 1.官方介紹 SLM770A是美格智能最新推出的一款LTE Cat.4無線通訊模組,最大支持下行速率150Mbps及上行速率50Mbps。同時向下兼容現有的3G和2G網絡,以確保即使在偏遠地區也可以進行網絡通信。 SLM770A模組支持分集接收和MIMO技…

微信小程序:多菜單欄設計效果

一、實現效果 二、代碼 wxml 編輯前端界面,步驟 菜單邏輯: 逐步取出數組中的項,首先取出頂部菜單項,然后選中后取出選中的底部數據(左側菜單+右側內容),然后點擊左側菜單取出選中的左側菜單對應的右側內容 ①這里我的數據是全部封裝到一個數組對象的,首先我的循環…

C++基礎知識學習記錄—string類

string實際上是C內置的一個類,內部對char *進行了封裝,不用擔心數組越界問題,string類中,除了上課講解的函數外,還有很多函數可以使用,可以自行查閱文檔。 構造函數原型: string(); //創建一個…

Ollama+DeepSeek+Open-WebUi

環境準備 Docker Ollama Open-WebUi Ollama 下載地址:Ollama docker安裝ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下載模型 Ollama模型倉庫 # 示例:安裝deepseek-r1:7b doc…

設計模式--訪問者模式【行為型模式】

設計模式的分類 我們都知道有 23 種設計模式,這 23 種設計模式可分為如下三類: 創建型模式(5 種):單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。結構型模式(7 種)&#xff1…

前端循環全解析:JS/ES/TS 循環寫法與實戰示例

循環是編程中控制流程的核心工具。本文將詳細介紹 JavaScript、ES6 及 TypeScript 中各種循環的寫法、特性,并通過實際示例幫助你掌握它們的正確使用姿勢。 目錄 傳統三劍客 for 循環 while 循環 do...while 循環 ES6 新特性 forEach for...of for...in 數組…

數據中心儲能蓄電池狀態監測管理系統 組成架構介紹

安科瑞劉鴻鵬 摘要 隨著數據中心對供電可靠性要求的提高,蓄電池儲能系統成為關鍵的后備電源。本文探討了蓄電池監測系統在數據中心儲能系統中的重要性,分析了ABAT系列蓄電池在線監測系統的功能、技術特點及其應用優勢。通過蓄電池監測系統的實施&#…

Mac端homebrew安裝配置

拷打了一下午o3-mini-high,不如這位博主的超強帖子,10分鐘結束戰斗 跟隨該文章即可,2025/2/19親測可行 mac 安裝HomeBrew(100%成功)_mac安裝homebrew-CSDN博客文章瀏覽閱讀10w次,點贊258次,收藏837次。一直覺得自己寫…