面试题之箭头函数和普通函数有什么区别?

箭头函数(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 属性。

    • 语法简洁。

根据实际需求选择合适的函数类型可以提高代码的可读性和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windwos与linux环境下Iperf3带宽测试工具的安装、使用

目录 一、前言 二、windows 2.1下载 2.2安装 2.3使用 2.3.1服务端 2.3.2客户端 2.3.3输出内容 1.客户端 2.服务端 2.4.相关命令 三、linux 3.1安装 3.2使用 1.服务端 2.客户端 3.输出内容 1.客户端 2.服务端 一、前言 在数字化浪潮下,网络性能…

达梦统计信息

统计信息 统计信息概述 统计信息是数据库中关于表和索引数据的元信息,用于描述数据的分布、唯一性、大小等特征。数据库优化器依赖统计信息来选择最优的执行计划。统计信息对于 CBO(基于代价的优化器)生成执行计划具有直接影响。 收集统计…

【面试系列】Java开发--AI常见面试题

1、实际工作或学习中用过哪些Ai工具 1.1、AI编程1.2、AI对话聊天1.3、AI图像工具1.4、AI办公工具 2、谈谈你知道的AI领域的一些常见词汇及其含义的理解? 例如AIGC、LLM、DeepLearning分别是什么意思? 2.1、AIGC(Artificial Intelligence Gene…

一文讲解Redis为什么读写性能高以及I/O复用相关知识点

Redis为什么读写性能高呢? Redis 的速度⾮常快,单机的 Redis 就可以⽀撑每秒十几万的并发,性能是 MySQL 的⼏⼗倍。原因主要有⼏点: ①、基于内存的数据存储,Redis 将数据存储在内存当中,使得数据的读写操…

OnlyOffice:前端编辑器与后端API实现高效办公

OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCCALE:灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…

fastadmin实现海报批量生成、邮件批量发送

记录一个海报批量生成、邮件批量发送功能开发,业务场景如下: 国外客户做观展预登记,工作人员通过后台,批量给这些观众生成入场证件并发送到观众登记的邮箱,以方便观众入场时快速进场。证件信息包含入场二维码、姓名&a…

3.Docker常用命令

1.Docker启动类命令 1.启动Docker systemctl start docker 2.停止Docker systemctl stop docker 3.重启Docker systemctl restart docker 4.查看Docker状态 systemctl status docker 5.设置开机自启(执行此命令后每次Linux重启后将自启动Docker) systemctl enable do…

1.21作业

1 unserialize3 当序列化字符串中属性个数大于实际属性个数时,不会执行反序列化 外部如果是unserialize()会调用wakeup()方法,输出“bad request”——构造url绕过wakeup 类型:public class&…

【Spring详解四】自定义标签的解析

四、自定义标签的解析 自定义标签的解析是通过 BeanDefinitionParserDelegate .parseCustomElement(ele)进行的,解析来我们进行详细分析。 DefaultBeanDefinitionDocumentReader.class 4.1 自定义标签的使用 扩展 Spring 自定义标签配置一般需要以下几个步骤&#x…

基于springboot校园健康系统的设计与实现(源码+文档)

大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…

如何修改Windows系统Ollama模型存储位置

默认情况下,Ollama 模型会存储在 C 盘用户目录下的 .ollama/models 文件夹中,这会占用大量 C 盘空间,增加C盘“爆红”的几率。所以,我们就需要修改Ollama的模型存储位置 Ollama提供了一个环境变量参数可以修改Ollama的默认存在位…

基于Python+Vue开发的反诈视频宣传管理系统源代码

项目简介 该项目是基于PythonVue开发的反诈视频宣传管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的反…

VMware安装Centos 9虚拟机+设置共享文件夹+远程登录

一、安装背景 工作需要安装一台CentOS-Stream-9的机器环境,所以一开始的安装准备工作有: vmware版本:VMware Workstation 16 镜像版本:CentOS-Stream-9-latest-x86_64-dvd1.iso (kernel-5.14.0) …

华为云deepseek大模型平台:deepseek满血版

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 1、注册: 华为云deepseek大模型平台注册:https://cloud.siliconflow.cn/i/aDmz6aVN 说明:填写邀请码的话邀请和被邀请的账号都会获得2000 万 Tokens;2个帐号间不会与其他关联…

import requests Pycharm 报错

#PyCharm安装requests失败解决方法 PyCharm安装request失败解决方法(亲测有效) import requests Pycharm 报错 尝试从系统终端运行此命令。确保使用为 D:\Python\venv\Scripts\python.exe 处的 Python 解释器安装的正确版本的 pip。失败一&#xff1…

基于云的物联网系统用于实时有害藻华监测:通过MQTT和REST API无缝集成ThingsBoard

论文标题 **英文标题:**Cloud-Based IoT System for Real-Time Harmful Algal Bloom Monitoring: Seamless ThingsBoard Integration via MQTT and REST API **中文标题:**基于云的物联网系统用于实时有害藻华监测:通过MQTT和REST API无缝集…

VMware converter standalone迁移windows老版本系统到esxi

最近因为有个客户有5台老服务器想淘汰掉换成新服务器,有多老呢?差不多20年了。比我干这个行业的时间还久。 老服务器的系统分别是: 1:3台windows server 2008 sp2 x64系统 2:2台windows server 2003 sp2 x32系统 新服务…

python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法

【1】引言 前序学习进程中,已经掌握了使用Eigenfaces算法进行的人脸识别。相关文章链接为: python学opencv|读取图像(七十四)人脸识别:EigenFaces算法-CSDN博客 在此基础上,学习剩余两种人脸识别算法&am…

【GaussTech技术专栏】GaussDB AI大模型在智能运维场景的应用

在数字化转型的浪潮中,数据库作为企业数据管理的核心,扮演着至关重要的角色。随着业务规模的扩大和数据量的激增,数据库运维的复杂性也随之增加。传统运维方法在确保数据高可用性、系统稳定性、性能优化及故障快速响应方面,面临着…