箭头函数和普通函数的区别

news2024/11/26 11:32:11

1. 写法不同

const arrayFn = (a, b) => a + b;
function add(a, b) => {
    return a + b;
}

2. 内部this的指向不同

window.a = 1;

// 箭头函数中的this在定义时就已经固定,不会因为调用对象的不同而改变
const loga = () => {
    const a = 2;
    return this.a;
}

// this在该函数被调用时,才知道this的指向
function fn() {
    const a = 3;
    return this.a;
}

// 例如:
loga(); // 1
fn(); // 1

const obj = {
    loga,
    fn,
    a: "obj"
}
obj.loga(); // 1
obj.fn(); // "obj"

// obj.loga依然返回window.a,也就是定义时this的指向
// 而obj.fn返回的则是obj.a,因为他的this指向了obj,也就是谁调用普通函数,普通函数的this就指向谁,默认指向window

// 根据这个特性,可以在react中使用箭头函数来减少bind的使用
import React, { Component } from "react";
class Header extends Component {
    constructor() {
        super();
        this.data = {
            a: 1
        }
    }
    log() {
        console.log(this.data)    
    }
    
    // 箭头函数在定义时就确认了内部this的指向
    _log = () => { console.log(this.data) }
    
    render() {
        return (
            <div>
                <button onClick={this.log.bind(this)}>normal</button>
                <button onClick={this._log}>array</button>
            </div>        
        )    
    }
}

3. 普通函数可以当作构造函数来实例化,而箭头函数不行,因为箭头函数没有constructor

请添加图片描述

4. 普通函数可以通过bind,call,apply来指定this的指向,而箭头函数不行

请添加图片描述

5. 在class中,定义普通函数和箭头函数的区别

class Father {
    constructor(state) {
        this.state = state
    }
    arrowMethod = () => {}
    generalMethod() {}
};

class Son extends Father {
    constructor(state) {
        super(state)
    }
};

const instance1 = new Father();
const instance2 = new Father();
const instance3 = new Son();

// 在实例化时,每个箭头函数都会生成一个新的方法,导致方法不能共享一个内存。
// instance1.arrowMethod === instance2.arrowMethod                     // false
// 只要是继承了父构造函数,他们的普通函数都会被继承,且指向同一个内存地址,可以减少内存开支。
// instance1.generalMethod === instance2.generalMethod === instance3.generalMethod          // true

6. 普通函数中可以使用arguments变量获取所有的参数,而箭头函数中没有该变量,所以需要配合es6的扩展运算符取到所有参数

function add() {
    let result = 0;
    // 这个arguments的东西也是个对象,而且是一个特殊的对象,
    // 它的属性名是按照传入参数的序列来的,第1个参数的属性名是’0’,第2个参数的属性名是’1’,以此类推,并且它还有length属性,存储的是当前传入函数参数的个数,
    // 很多时候我们把这种对象叫做类数组对象。
    // 类数组对象和数组都是对象这个妈生的,但是数组是大哥比类数组对象多了很多其他的玩具(方法),类数组对象只是长得很像数组的弟弟而已。
    for(let i = 0; i < arguments.length; i++) {
        result += arguments[i]
    }
    return result;
}

const arrayAdd = (...args) => args.reduce((prev, curr) => prev + curr, 0);

add(1,2,3,4,5) // 15
arrayAdd(1,2,3,4,5) // 15

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言学习】逃逸字符(转义字符)

逃逸字符&#xff08;转义字符&#xff09; 1.\" 双引号 \" printf("请分别输入身高的英尺和英寸&#xff0c;""如输入\"5 7\"表示5英尺7英寸:");这里的"\就是双引号的作用&#xff0c;因为在双引号里面直接用双引号无意义&…

C++问题记录:VS中使用cout输出vsnprintf()产生的字符串有乱码

1. 问题介绍 使用Visual Studio开发一个C项目的时候&#xff0c;使用vsnprintf()生成格式化字符串&#xff0c;在使用std::cout输出该字符串的时候产生乱码&#xff0c;但是使用printf()输出的结果是正常的&#xff0c;下面是相关代码和结果&#xff0c;如有指教&#xff0c;欢…

量子力学的挑战和未来:未解决的问题和可能的发展方向

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在前面的几篇文章中&#xff0c;我们已经深入探讨了量子力学的起源、基本概念、实验验证以及应用领域&#xff0c;包括量子计算、量子通信和量子感应。今天&#xff0c;我们将探讨量子力学所面临的挑战以及未来可能的…

【雕爷学编程】 MicroPython动手做(34)——通用传感器的综合运用2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

@ControllerAdvice注解使用及原理探究 | 京东物流技术团队

最近在新项目的开发过程中&#xff0c;遇到了个问题&#xff0c;需要将一些异常的业务流程返回给前端&#xff0c;需要提供给前端不同的响应码&#xff0c;前端再在次基础上做提示语言的国际化适配。这些异常流程涉及业务层和控制层的各个地方&#xff0c;如果每个地方都写一些…

【云原生】Docker中容器管理常用所有命令

1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项&#xff1a;--name&#xff1a;为容器命名 -i&#xff1a;交互式创建容器 -d&#xff1a;后台创建容器 -t&#xff1a;为容器分配伪终端 Docker 容器存在的意义就是为…

Demystifying Prompts in Language Models via Perplexity Estimation

Demystifying Prompts in Language Models via Perplexity Estimation 原文链接 Gonen H, Iyer S, Blevins T, et al. Demystifying prompts in language models via perplexity estimation[J]. arXiv preprint arXiv:2212.04037, 2022. 简单来说就是作者通过在不同LLM和不同…

如何提升自信更好地面对挑战

简而言之&#xff1a;扬长避短&#xff0c;做自己。 动态 - CSDN AI话痨&#xff1a; 提升自信是面对挑战的关键之一。以下是一些方法可以帮助你提升自信&#xff0c;更好地面对挑战&#xff1a; 自我认知&#xff1a;了解自己的优点和缺点&#xff0c;认识到自己的强项和弱…

无涯教程-Perl - Subroutines(子例程)

定义子程序 Perl编程语言中 Subroutine子程序定义的一般形式如下: sub subroutine_name {body of the subroutine } 调用该Perl Subroutine的典型方式如下- subroutine_name( list of arguments ); 在Perl 5.0之前的版本中&#xff0c;调用 Subroutine的语法略有不同&…

【LeetCode】相同的树、 翻转二叉树 、对称二叉树

100.相同的树 两棵树相同的条件就是根节点及他们的左右子树的值val相同&#xff0c;结构相同&#xff0c;就是一模一样&#xff0c;那这道题最终还是要同时遍历两个树的&#xff0c;并且还得遍历完&#xff0c;那如果我们在遍历的过程中&#xff0c;通过设置一些不满足相同的树…

【知识图谱】图数据库Neo4jDesktop的安装图文详解(小白适用)

neo4j 的安装需要有jdk环境的支持。因此在安装Neo4j之前&#xff0c;需要安装Java JDK。 一.安装JDK 参考文章https://blog.csdn.net/weixin_41824534/article/details/104147067?spm1001.2014.3001.5502 二.Neo4j下载 进入Neo4j官网 选择下载中心 下滑选择Neo4j Deskto…

Python渗透测试编程——AES与DES算法

一、AES简介 AES&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09;的出现&#xff0c;是因为以前使用的DES算法密钥长度较短&#xff0c;已经不适应当今数据加密安 全性的要求&#xff0c;因此2000年10月2日&#xff0c;美国政府宣布将比利时密码…

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自&#xff1a;雷达学报 作者&#xff1a;易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇 1. 引 言 雷达是信息感知的千里眼&#xff0c;具有极高的军用和民用价值&#xff0c;广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占…

window中,关闭java占用端口的进程

查看端口被占用的情况 netstat -ano|findstr "端口号"使用Tasklist查看对于 PID 的进程名 tasklist|findstr "PID号"通过 taskkill 命令方式结束进程 taskkill /f /t /im Pid

更新k8s环境支付系统支付证书

目录 一、背景 二、更新支付系统银行证书 三、备份旧的secret信息 四、更新支付应用的证书信息 五、重启支付系统的应用 六、验证应用实例挂载的秘钥已更新 一、背景 支付系统是基于k8s容器化部署的微服务&#xff0c;支付系统使用的支付证书以及和银行有关的证书都是保存…

SpringBoot中事务失效的原因

SpringBoot中事务失效的原因 文章目录 SpringBoot中事务失效的原因一、事务方法非public修饰二、非事务方法调用事务方法三、事务方法的异常被捕获四、事务异常类型不对五、事务传播行为不对六、没有被Spring管理6.1、暴漏代理对象6.2、使用代理对象 常见的事务失效原因包括如下…

《Flask Web 开发指南 pt.2》

在编写 Flask 程序的时候&#xff0c;你需要注意你的程序文件不要命名为 flask.py&#xff0c;建议命名为 app.py 或者 wsgi.py 但如果你的程序不是叫 app.py 或者 wsgi.py&#xff0c;那么你就需要设置环境变量 FLASK_APP 的值为程序名字 设置环境变量有两种方法&#xff0c;在…

聚观早报 | 腾讯字节等企业驰援防汛救灾;新能源车7月销量单出炉

【聚观365】8月4日消息 腾讯字节等企业驰援防汛救灾新能源车7月销量成绩单出炉Model Y等车型低温续航衰减严重华为Mate60系列猜想图曝光支付宝做短视频引来羊毛党 腾讯字节等企业驰援防汛救灾 近日&#xff0c;京津冀地区遭遇极端降雨天气&#xff0c;引发洪涝和地质灾害&…

智能仪表板DevExpress Dashboard v23.1亮点 - 增强对自定义导出的支持

DevExpress Dashboard v23.1版本增强了自定义导出到Excel的功能等&#xff0c;欢迎下载最新版本体验&#xff01; DevExpress Dashboard v23.1正式版下载(Q技术交流&#xff1a;523159565&#xff09; 所有平台 导出自定义仪表板项目到Excel 用户现在可以在WinForms和Web应…

吴新宙「跳槽」背后,是英伟达全栈智能汽车方案的「野心」

8月2号晚&#xff0c;小鹏汽车CEO何小鹏发文&#xff1a;因家庭和多方面的原因&#xff0c;小鹏汽车自动驾驶副总裁吴新宙将离开公司。同时也确定了吴新宙下一站&#xff1a;知名公司&#xff08;英伟达&#xff09;最高等级华人高管。 事实上&#xff0c;在过去的五年时间里&a…