JavaScript this、闭包和箭头函数

news2025/1/19 11:16:12

this

this是函数内部的特殊对象之一(其他还有arguments、caller、new.target)。

this的 指向 或 值 是不确定的取决于函数的调用方式

在JavaScript中,this的指向有以下几种情况:

  • 作为对象的方法调用
  • 作为普通函数调用
  • 构造器调用
  • Function.prototype.call或Function.prototype.apply调用

此外,this在使用 闭包 和 箭头函数 时的情况我们在后面介绍两者时再谈。


1.作为对象的方法调用

当函数作为对象的方法被调用时,this指向该对象。

const obj = {
    name: 'obj',
    getName: function () {
        console.log(this.name);
    }
}
obj.getName(); //obj

2.作为普通函数调用

当函数不作为对象的属性被调用时,this指向全局对象,浏览器中是window对象。

const name = 'window'
const getName = function () {
    console.log(this.name);
}
getName(); //window

3.构造器调用

当函数被new调用时,this指向新创建的对象。

const Person = function (name) {
    this.name = name;
}
const person = new Person('person');

console.log(person.name); //person

4.Function.prototype.call或Function.prototype.apply调用

当使用call或apply调用时,this指向传入的第一个参数。

const obj = {
    name: 'obj'
}
const getName = function () {
    console.log(this.name);
}
getName.call(obj); //obj

闭包

闭包(closure)是指访问了另一个函数作用域中的变量的函数

创建闭包的最常见的方式就是在一个函数内部创建另一个函数,即嵌套函数

const a4=4;
var a5=5;
const func1 = function (a3) {
    const a2=2;
    function func2() {
        const a1=1;
        return function func3(){
            console.log(a1+a2+a3+a4+a5);
        }
    };
    return func2();
};
const result=func1(3);
result();

外部函数的活动对象位于内部函数作用域链上的第二个,该作用域链直到全局执行上下文才终止。

活动对象是包含函数的所有局部变量的对象(包括arguments对象),在函数调用时被创建,在函数执行完后被销毁,即只存在于函数执行期间。而在全局上下文中,这叫做变量对象

image-20230829134446401

[[Scopes]]保存了函数的作用域链。

闭包读取函数内部的变量,这使得变量始终保存在内存中,不会在函数调用后被自动清除,这会导致内存泄漏,如果闭包的作用域中有大量的变量,会占用大量的内存。

箭头函数

箭头函数是ES6新增的语法,它的this指向是固定的,指向定义时所在的对象,而不是使用时所在的对象

示例:

window.count=1;
function Counter() {
    this.count = 0;
    console.log(this);
    this.add = function () {
        this.count++;
    }
}
var counter = new Counter();
setTimeout(counter.add, 1000);
setTimeout(function () {
    console.log(counter.count);
    console.log(window.count);
}, 2000);

输出结果为

Counter {count: 0}
0
2

奇怪,为什么输出结果是0和2,而不是1和1呢?

这是因为setTimeout中的this指向了window,而不是counter,所以counter.add()中的this.count++实际上是window.count++,而不是counter.count++。

解决方法:

1.使用bind绑定this

setTimeout(counter.add.bind(counter), 1000);

2.使用_this = this保存this

function Counter() {
    var _this = this;
    this.count = 0;
    console.log(this);
    this.add = function () {
        _this.count++;
    }
}

3.使用箭头函数

function Counter() {
    this.count = 0;
    console.log(this);
    this.add = () => {
        this.count++;
    }
}

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

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

相关文章

avalonia、WPF使用ScottPlot动态显示ECG心电图

文章目录 avalonia、WPF使用ScottPlot动态显示ECG心电图实现效果,动态效果懒得录视频了安装代码部分UpdateData方法就是用来更新心电图表的方法, 根据消息队列数据去更新是视图中的ScottPlot 图表 avalonia、WPF使用ScottPlot动态显示ECG心电图 avalonia…

linux系统离线安装python以及python包

效果 1、下载python 从华为镜像网站下载 https://mirrors.huaweicloud.com/python/ 我下载的是python3.7.12版本的 2、安装python 按一系列的命令安装 mkdir /usr/local/python3 cd /usr/local/python3 tar -xvf Python-3.7.12.tar

LeetCode第16~20题解

CONTENTS LeetCode 16. 最接近的三数之和(中等)LeetCode 17. 电话号码的字母组合(中等)LeetCode 18. 四数之和(中等) LeetCode 16. 最接近的三数之和(中等) 【题目描述】 给你一个…

request+python操作文件导入

业务场景: 通常我们需要上传文件或者导入文件如何操作呢? 首先通过f12或者通过抓包查到请求接口的参数,例如: 图中标注的就是我们需要的参数,其中 name是参数名,filename是文件名,Content-Type是…

服务器数据恢复-重组RAID导致RAID6数据丢失的数据恢复案例

服务器数据恢复环境: 一台存储设备中有一组由12块硬盘组建的RAID6磁盘阵列,上层采用EXT3文件系统,共划分3个LUN。 服务器故障&分析: 存储设备在运行过程中RAID6阵列突然不可用,管理员对故障存储进行了重新分配RAI…

算法设计 || 第7题:TSP问题的成本矩阵

(一)TSP问题学习 看不懂可以观看这个老师视频学习:分支限界法(TSP问题,多段图的最短路径问题,任务分配问题,批处理作业调度问题)(算法设计第十周二节)_哔哩哔哩_bilibili (二) 考试例题 画出计算求解最优解的分支界限过…

CentOS7关闭防火墙的操作方法

使用命令:systemctl status firewalld.service 查看防火墙状态 执行后能看到绿色字样标注的“active(running)”,说明防火墙是开启状态 使用命令:systemctl stop firewalld.service 关闭运行的防火墙 关闭后,使用命令systemctl st…

恒运资本:重磅利好预期升温!央行大动作,成长股关键变量生变

尽管上周末利好齐发,但应该还有利好在路上! 从银行间商场拆借利率来看,最近银行的资金好像在收紧。而据财政部音讯,本年新增专项债券力求在9月底前根本发行结束,用于项目建造的专项债券资金力求在10月底前使用结束。这…

jvm的内存区域

JVM 内存分为线程私有区和线程共享区,其中方法区和堆是线程共享区,虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。 1)程序计数器 程序计数器(Program Counter Register)也被称为 PC 寄存器,是一块…

Vue3+TS+Vite中 vConsole 插件的使用

平时在web应用开发过程中,我们可以console.log去输出一些信息,但是在移动端,也就是在手机上,console.log的信息我们是看不到的,这时候就需要移动端调试工具vConsole 1. 依赖安装 npm install vconsole 或者 yarn ad…

亚马逊反馈和评论的区别

在亚马逊上,"反馈"(Feedback)和"评论"(Review)是两个不同的概念,它们分别用于描述购买者与商品或卖家之间的不同方面。 1、反馈(Feedback): 亚马逊的…

【Python开发环境搭建】【Pycharm设置】 新建python文件默认添加编码格式、时间、作者、文件名等信息

1、设置路径 打开pycharm,选择File->Settings(Ctrl Alt S),Editor->File and Templates->Python Script 文件- 设置-编辑器-文件和代码模板-Python Script 2、设置内容 # -*- coding: utf-8 -*- # Time : ${DATE} …

pom.xml配置文件失效,显示已忽略的pom.xml --- 解决方案

现象: 在 Maven 创建模块Moudle时,由于开始没有正确创建好,所以把它删掉了,然后接着又创建了与一个与之前被删除的Moudle同名的Moudle时,出现了 Ignore pom.xml,并且新创建的 Module 的 pom.xml配置文件失效&#xf…

zookeeper启动失败(Error contacting service. It is probably not running.)

问题描述 启动zk时报如下错误: 解决办法 先查日志找找报错原因: 找到zk安装目录下的logs文件夹下的日志文件,查看连接失败原因: 如果是端口问题,修改conf文件,指定端口重新启动即可: 注&a…

springboot1.5.12升级至2.6.15

首先&#xff0c;加入springboot升级大版本依赖&#xff0c;会在升级过程中打印出错日志提示&#xff08;升级完毕可去除&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</art…

DP读书:鲲鹏处理器 架构与编程(十一)鲲鹏生态软硬件构成

鲲鹏生态软硬件构成 鲲鹏软件构成硬件特定软件1. Boot Loader2. SBSA 与 SBBR3. UEFI4. ACPI 鲲鹏软件构成 鲲鹏处理器的软件生态是一个不断发展的软件生态&#xff0c;服务器本身也具有复杂度多样性&#xff0c;经过很长时间的发展服务器硬件有不同的操作系统方案&#xff0c…

为什么 Higress 是 Knative 入口网关的最佳实践?

作者&#xff1a;赵伟基&#xff08;兆维&#xff09; 在传统的应用开发中&#xff0c;通常需要管理底层的基础设施、服务器与网络配置等方面的工作。然而在云原生 Serverless 化的浪潮下&#xff0c;这些基础设施的细节被抽象和自动化&#xff0c;开发者无需关注服务器等配置…

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

【附安装包】谷歌浏览器安装教程

软件下载 软件&#xff1a;谷歌浏览器版本&#xff1a;110.0.5181语言&#xff1a;简体中文大小&#xff1a;1.3M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.59GHz 内存2G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://p…