箭头函数与普通的函数有什么区别-M

news2024/11/19 14:44:53

箭头函数与普通的函数有什么区别

1、写法不同

在 js 中,像命名式函数、函数表达式都称为普通函数。对于普通函数,需要用function关键字来声明。而箭头函数则不需要使用function关键字,在箭头前面的括号里面写参数,后面的大括号里面写方法体。箭头函数语法更加简洁清晰。

// 命名式函数
function normalFn(参数) {
	// 方法体
    return 'normalFn';
}
// 函数表达式
const normalFn = function(参数) {
	// 方法体
    return 'normalFn';
}
// 箭头函数
const arrowFn = (参数) => {
	// 方法体
    return 'arrowFn';
}

2、this指向不同

普通函数

在普通函数中,this 的指向是动态的,其值取决于函数是如何被调用的,通常有以下 4 种调用方式:
1)直接调用时,其指向为全局对象(严格模式下为 undefined)

function fnc() {
    console.log(this); //window{}
}

fnc(); // 全局对象(global 或 window)

2)方法调用时,this指向为调用该方法的对象

let obj = {
    fnc1(){
        console.log('fnc1', this === obj); // fnc1 true
    }
}
obj.fnc2 = function() {
    console.log('fnc2', this === obj); // fnc2 true
}
function fnc3() {
    console.log('fnc3', this === obj); // fnc3 true
}
obj.fnc3 = fnc3;
obj.fnc1(); // true
obj.fnc2(); // true
obj.fnc3(); // true

3)new 调用时,其指向为新创建的实例对象

function fnc() {
    console.log(this); //fnc {}
}
let obj = new fnc(); // fnc 的实例 fnc {} 这里就是obj

4)call、apply、bind 调用时,其指向为三种方法的第一个参数

function fnc() {
    console.log(this);
}
let obj = {name: '张三',age: 18}
fnc.call(obj)	// obj对象
fnc.apply(obj)	// obj对象
fnc.bind(obj)()	// obj对象

在这里插入图片描述
bind() 函数是创建一个新的函数,不会立即执行,需要手动调用

箭头函数

箭头函数的this指向是静态的,无论如何执行或在何处执行,箭头函数内部 this 始终指向创建时所在作用域指向的对象。由于箭头函数没有自己的 this 指针,call()、apply()、bind()等方法不能改变箭头函数中this指向的。

const obj = {
    fnc(arr) {
        console.log(this === obj); // true(obj)
        const cb = () => {
            console.log(this === obj); // true(obj)
        };
        arr.forEach(cb);
    }
};
obj.fnc([1, 2, 3]);

3、箭头函数不能作为构造函数使用

因为箭头函数没有自己的this,它的this其实是继承了外层执行环境中的this,且this指向永远不会变,并且箭头函数没有原型prototype,没法让他的实例的__proto__属性指向,所以箭头函数也就无法作为构造函数,用new调用时会报错。

var Foo = () => {};
var foo = new Foo(); 

在这里插入图片描述

new内部实现其实是分为以下四步:
1)新建一个空对象
2)链接到原型
3)绑定this,执行构造函数
4)返回新对象

function myNew() {
	// 1.新建一个空对象
	let obj = {}
	// 2.获得构造函数
	let con = arguments.__proto__.constructor
	// 3.链接原型
	obj.__proto__ = con.prototype
	// 4.绑定this,执行构造函数
	let res = con.apply(obj, arguments)
	// 5.返回新对象
	return typeof res === 'object' ? res : obj
}

4、箭头函数没有prototype属性。

在这里插入图片描述

5、参数

普通函数与箭头函数在参数上区别主要在于,箭头函数不绑定 arguments 对象。
在这里插入图片描述

当我们需要使用参数时,可以考虑ES6中的rest(剩余)参数。

const fn = (...args) => args[0];
fn(1,2,3,4)

在这里插入图片描述

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

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

相关文章

Linux 安装MySQL-5.7.30

1.官网下载MySQL 进入官网https://www.mysql.com/ 从下载页面下载社区版本其中社区版本免费,免费的午餐不提供技术支持. 页面中MySQL Enterprise Edition是企业版,企业版收费但是会提供技术支持, 点击图中红框下载社区版本 选择Download Arc…

AC,AP以及三阶段项目

特点:access:连接终端设备 只能通过1个vlan trunk:交换机与交换机相连 可以通过多个vlan 共同特点:交换机的端口收发数据的规则: 收:如果收到的数据,没有携带任何标签,则使用该端口…

01SpringCloudRibbon负载均衡

Ribbon负载均衡 Ribbon Eureka帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。 什么是Ribbon:客户端负载均衡组件 开启负载均衡 1、Eureka中已经集成了Ribbon,所以我们无需引入新的依赖,直接修改代码。 2、…

Redis的主从集群搭建与配置

文章目录 Redis主从集群模式搭建过程分级管理容灾冷处理 Redis主从集群模式 Redis的集群模式 主从复制模式:利用主从复制原理,一主多从架构。读写分离,主节点可读可写,从节点只能提供读服务。哨兵模式:哨兵实现了自动化…

Vue 3 + Element Plus 简单用法

Element Plus: A Desktop UI toolkit for Vue.js 即 Vue 桌面 UI 工具包 基于 Vue 2 的组件库和基于 Vue 3 的组件库安装方法不同,基于 Vue 3 的组件库叫做 Element Plus。 MDBootstrap 与 Element UI 区别: MD Bootstrap vs ElementUI: W…

如何在金融企业推进故障演练?中国人寿分阶段实践总结

一分钟精华速览 越来越多企业正在通过故障注入和演练的方式提升系统可靠性,这其中金融行业的应用较为特殊。一方面其可靠性要求比非涉账类系统更高;另一方面金融行业有更加严格的监管要求,如客户、账目等信息都有严格约束。加之金融系统较其…

ActiveMQ基础学习简单记录

ActiveMQ基础学习简单记录 JMS是什么JMS消息模型JMS Message Type Activemq安装概念强化JMS的跨平台性JMS通用接口JMS希望达到的目标是什么 Activemq发送消息的三种模式至少一次至多一次精确一次可重复确认模式小结 Activemq支持众多协议Activemq支持的定时消息,延迟消息,优先级…

【C++技能树】类和对象的使用 --初始化列表,static,友元,内部类,匿名对象的理解与使用

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我bua! 类和对象的使用 0. 初始化列表explicit关键字 1.Static静态成员变量2.友元2.1.友元函数2.2.友元类 3.内部类4.匿名对象4.匿名对象至此初始化列表,static…

【Linux】2. Shell运行原理与Linux权限操作

专栏导读 🍁作者简介:余悸,在读本科生一枚,致力于 C方向学习。 🍁收录于 C 专栏,本专栏主要内容为 C 初阶、 C 进阶、 STL 详解等,持续更新中! 🍁相关专栏推荐&#xff1…

Cloud Studio 有“新”分享

GitHub仓库推荐 Awesome Open Source Applications - 收集了各种开源应用程序,包括 Web 应用、桌面应用、移动应用等。Cloud Studio 一键运行 Free for Dev - 收集了各种免费的开源应用程序和工具,包括 Web 应用、桌面应用、移动应用等。Cloud Studio 一…

kaggle经典赛 | IEEE欺诈检测竞赛金牌方案分享

https://www.kaggle.com/competitions/ieee-fraud-detection 赛题背景 想象一下,站在杂货店的收银台,身后排着长队,收银员不那么安静地宣布你的卡被拒绝了。在这一刻,你可能没有考虑决定你命运的数据科学。 尴尬,并…

一文搞定验证码(上部分)

1.背景 目前收到反馈,存在一类用户,在利用会员权益大量进行二次销售;而且还是自动进行操作的. 那么意味着他们有一个自动平台在对我们的商品进行二次销售. 这是就该我们的主角登场了. 验证码模块可以有效防止机器人刷接口 2.开源验证码框架 通过在网上查找资料, 发现了几个验…

C++:采用哈希表封装unordered_map和unordered_set

目录 一. 如何使用一张哈希表封装unordered_map和unordered_set 二. 哈希表迭代器的实现 2.1 迭代器成员变量及应当实现的功能 2.2 operator函数 2.3 operator*和operator->函数 2.4 operator!和operator函数 2.5 begin()和end() 2.6哈希表迭代器实现代码 三. unord…

渗透测试--6.2.mdk3攻击wifi

前言 本次依然使用Kali虚拟机系统,win11主机,网卡Ralink 802.11 配合mdk3进行wifi伪造、连接设备查看、解除认证攻击。本次实验只用于学习交流,攻击目标为自家的手机热点,请勿违法使用! 目录 前言 1.Deauth攻击原…

Electron简介、安装、实践

本文中的所有代码均存放在https://github.com/MADMAX110/my-electron-app Electron是什么? Electron是一个开源的框架,可以使用JavaScript, HTML和CSS来构建跨平台的桌面应用程序。Electron的核心是由Chromium和Node.js组成,它们分别提供了渲…

【springboot 开发工具】接口文档我正在使用它生成,舒坦

前言 先来描述下背景:由于新公司业务属于自研产品开发,但是发现各产品业务线对于接口文档暂时还是通过集成Swagger来维护,准确来说是knife4j(Swagger的增强解决方案)。但是对于5年的后端开发老说,早就厌倦…

Java-线程安全的四个经典案例和线程池

单例模式 有些对象,在一个程序中应该只有唯一 一个实例(光靠人保证不靠谱 借助语法来保证) 就可以使用单例模式 在单例模式下 对象的实例化被限制了 只能创建一个 多了的也创建不了 单例模式分为两种:饿汉模式和懒汉模式 饿汉模式…

[Java基础]—SpringBoot

Springboot入门 Helloworld 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent><dependencies><depend…

软件测试基础知识整理(四)- 软件开发模型、测试过程模型

目录 一、软件开发模型 1.1 瀑布模型 1.1.1 特点 1.1.2 优缺点 1.2 快速原型模型&#xff08;了解&#xff09; 1.2.1 特点 1.2.2 优缺点 1.3 螺旋模型&#xff08;了解&#xff09; 1.3.1 特点 1.3.2 优缺点 二、测试过程模型 2.1 V模型&#xff08;重点&#xff…

LeetCode_29. 两数相除

目录 题目描述 思路分析 我的题解 题目描述 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff…