一文搞懂 this 指向

在这里插入图片描述


目录

  • 一、前言
  • 二、箭头函数
  • 三、new指向
  • 四、bind
  • 五、call和apply
  • 六、bind call apply区别
  • 七、对象(obj.)
  • 八、全局this指向
  • 九、不在函数里


一、前言

JS 中 this 指向问题 - 掘金

在JavaScript中,this关键字表示当前执行代码的上下文对象。它的值取决于函数被调用的方式。this可以引用全局对象(在浏览器中是window对象),也可以引用当前对象(例如,在对象方法中),或者在使用构造函数创建对象时引用新创建的实例。

二、箭头函数

const obj = {fun1: function () {console.log(this);},fun2: () => {console.log(this);}
}obj.fun1(); // obj
obj.fun2(); // window
  • 箭头函数的 this 指向是在定义函数时确定的,而不是在运行时确定的。
  • 箭头函数内的 this 指向外层的 this
  • 箭头函数的 this 指向是无法改变的,即使使用 call、apply 或 bind 方法也无效。因此,在使用箭头函数时需要注意它的 this 指向。

三、new指向

// class Person {} 和 function Person(name, age) 都可以用来定义一个对象的构造函数,但它们有一些区别。// 语法:class 是 ES6 中新增的语法,用于定义类和构造函数,而 function 是 JavaScript 中早期就存在的语法,用于定义函数和构造函数。// 继承:class 支持更加简洁和灵活的继承方式,可以使用 extends 关键字来继承其他类,而 function 只能使用原型链来实现继承。// 方法定义:在 class 中,方法可以直接定义在类的内部,而在 function 中,方法需要定义在构造函数的原型对象上。class Person {constructor(name, age) {this.name = name;this.age = age;}print() {console.log(this);}
}const p1 = new Person('张三', 18);
p1.print()

  • 当你使用new关键字调用函数的时候,函数中的this指向一定是实例对象

四、bind

const person = {name: 'Alice',age: 20
};function sayHello() {console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}const sayHello2 = sayHello.bind(person);
sayHello2(); // 输出 "Hello, my name is Alice, I'm 20 years old."
  • 使用方法:bind(thisArg, arg1, arg2, /* …, */ argN)
  • bind 方法是 JavaScript 中用于改变函数执行时 this 关键字指向的方法。它会返回一个新的函数,该函数与原函数具有相同的函数体,但是 this 关键字被绑定到指定的对象上。
  • 需要注意的是,bind 方法不会修改原函数的 this 关键字,而是返回一个新的函数,但是不会立刻调用。同时,使用 bind 方法创建的新函数可以被多次调用,每次调用时都会使用相同的绑定对象,this不会被修改。

另外,bind 方法还可以用于实现函数柯里化(Currying),即将一个多参数函数转换为一个单参数函数序列的过程。例如:

function add(x, y) {return x + y;}const add5 = add.bind(null, 5);console.log(add5(3)); // 输出 8console.log(add5(7)); // 输出 12

五、call和apply

const person = {name: 'Alice',age: 20
};function sayHello() {console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}sayHello.apply(person);
sayHello.call(person);
  • call和apply都可以立即立即调用原函数,并且可以指定函数执行时的 this 关键字和参数列表

六、bind call apply区别

const name = '小王', age = 17const obj = {name: '小张',objAge: this.age,myFun: function (fm, t) {console.log(this.name + '年龄' + this.age)console.log(fm + t)}
}const db = {name: '小李',age: 18
}obj.myFun.bind(db, '北京', '上海')()
obj.myFun.call(db, '北京', '上海')
obj.myFun.apply(db, ['北京', '上海'])
  • 相同点:都会改变函数的this指向
  • 绑定不同:
    • bind不会改变原函数的this关键字,返回一个新的函数,不会立刻调用
    • call、apply都可以立即调用原函数
  • 传参不同:
    • bind、call传入一组参数
    • apply传入数组参数

七、对象(obj.)

function func() {console.log(this.x)
}obj = { x: 1 }
obj.func = func
obj.func() // 1
  • 函数赋值给对象,当前this指向obj
  • 如果是箭头函数会报错

八、全局this指向

function fn1 () {console.log(this);
}fn1() //window对象

九、不在函数里

不在函数中的场景,可分为浏览器的 script 标签里,或 Node.js 的模块文件里。

  1. 在 script 标签里,this 指向 Window。
  2. 在 Node.js 的模块文件里,this 指向 Module 的默认导出对象,也就是 module.exports。

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

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

相关文章

【Vue.js】使用Element搭建首页导航左侧菜单

目录 Mock.js 是什么 有什么好处 安装mockjs ​编辑 引入mockjs mockjs使用 login-mock Bus事物总线 首页导航栏与左侧菜单搭建 结合总线完成组件通讯 Mock.js 是什么 Mock.js是一个用于生成随机数据的模拟数据生成器。它可以帮助开发人员模拟接口请求,生…

10.正则表达式匹配

10.正则表达式匹配 上述5种可匹配情况的举例,便于理解: 1、a与ab星号是匹配的,分析:a与a匹配,让 b星号看作出现0次。 2、abb与ab*匹配,分析:ab与ab星号匹配,让b多出现1次时&#xff…

如何通过优化Read-Retry机制降低SSD读延迟?

近日,小编发现发表于2021论文中,有关于优化Read-Retry机制降低SSD读延迟的研究,小编这里给大家分享一下这篇论文的核心的思路,感兴趣的同学可以,可以在【存储随笔】VX公号后台回复“Optimizing Read-Retry”获取下载链接。 本文中主要基于Charge Trap NAND架构分析。NAND基…

多线程进阶:Callable和JUC的常见类

Callable 这是一个接口,类似于Runnable。 Runnable用来描述一个任务,描述的任务没有返回值。 Callable也是用来描述一个任务,描述的任务是有返回值的。 如果需要使用一个线程单独的计算出某个结果来,此时用Callable是比较合适…

爬虫异常处理实战:应对请求频率限制和数据格式异常

作为一名资深的爬虫程序员,今天我要和大家分享一些实战经验,教你如何处理爬虫中的异常情况,包括请求频率限制和数据格式异常。如果你是一个正在进行网络爬虫开发的开发者,或者对异常处理感兴趣,那么这篇文章将帮助你更…

【李沐深度学习笔记】基础优化方法

课程地址和说明 基础优化方法p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。 基础优化方法 在讲具体的线性回归实现之前,要先讲一下基础的优化模型的方法 梯度下降 当模型没有显示解&#xff08…

Rust之自动化测试(二):控制测试如何运行

开发环境 Windows 10Rust 1.72.1 VS Code 1.82.2 项目工程 这里继续沿用上次工程rust-demo 控制测试如何运行 正如cargo run编译您的代码,然后运行生成的二进制文件一样,cargo test在测试模式下编译您的代码,然后运行生成的测试二进制文件…

《计算机网络》——应用层

2.1 应用层协议原理(P54) 研发网络应用的核心是写出能够运行在不同端系统和通过网络彼此交流的程序。 2.1.1 网络应用程序体系结构 两种主流的应用体系结构:客户-服务器体系结构、对等体系结构。 客户-服务器体系:服务器是一个…

MeterSphere v2.10.X-lts 双节点HA部署方案

一、MeterSphere高可用部署架构及服务器配置 1.1 服务器信息 序号应用名称操作系统要求配置要求描述1负载均衡器CentOS 7.X /RedHat 7.X2C,4G,200GB部署Nginx,实现负载路由。 部署NFS服务器。2MeterSphere应用节点1CentOS 7.X /RedHat 7.X8C,16GB,200G…

二叉树题目:翻转等价二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:翻转等价二叉树 出处:951. 翻转等价二叉树 难度 4 级 题目描述 要求 对于二叉树,我们可以定义如下翻转操作:选…

【算法专题突破】二分查找 - x 的平方根(18)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:69. x 的平方根 - 力扣(LeetCode) 这道题就是求算数平方根, 要注意的点是他只需要保留整数部分,小数部分会舍去 2. 算法…

【HUAWEI】trunk和access两种链路模式实例

目录 🥮0.写在前面 🍣基本操作命令 🍣常见视图命令 🥮1、trunkaccess 🍣1.1、拓扑图 🍣1.2、操作思路 🍣1.3、配置操作 🍡1.3.1、LSW1配置 🍡1.3.2、LSW2配置 &#x1f3…

单列集合顶层接口Collection

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 集合体系结构 一、单列集合顶层接口Collect…

全面提升AD域安全认证 | 竹云IDaaS

传统的微软Active Directory目录已无法适应企业多样化的业务需求,借助身份云您可以快速整合企业本地、云端资源,从而使AD域管理变得更简单、安全、高效。 企业面临的挑战 AD域无法整合现代化系统 AD域仅支持 LDAP 、Kerberos 协议,不能整合…

数据结构-----串(String)详解

目录 前言 1.串的定义 相关类型 2.串的储存结构 顺序储存表示 堆分配储存表示 块链储存表示 3.串的操作方式 4.串的匹配算法 (1)BF算法 过程原理 代码实现(C/C) 算法分析 (2)KMP算法 过程…

红米note13 秒解锁BL 跳过168 秒解锁BL,红米Redmi Note 13 Pro+ 系列 无需等待168小时,刷入magisk教程 刷机包下载

最近入手了一台红米note13,发现需要等待168小时才能解锁BL,这让我感到非常困扰。不过,经过一番研究,我发现了一个秒解锁BL的方法,无需等待168小时,而且还可以刷入magisk,非常方便。 首先&#x…

【NetEQ】读 《白话解读 WebRTC 音频 NetEQ 及优化实践》学习笔记

白话解读 WebRTC 音频 NetEQ 及优化实践webrtc 的重要模块 官方文档 :转载请标明出处:大神翻译 大神地址 : https://blog.csdn.net/lhl_blog/article/details/10993605GIPS NetEQ概述 GIPS NetEQ是一项专为IP电信系统开发的高级语音质量处理技术,其能够在大幅提高语音质量的…

【Ubuntu18.04】Autoware.ai安装

Autoware.ai安装 1 ROS安装2 Ubuntu18.04安装Qt5.14.23 安装GCC、G4 Autoware安装与编译4.1 针对Ubuntu 18.04 / Melodic的依赖包安装4.2 Autoware环境搭建4.3 运行 Autoware4.4 ROSBAG Demo 1 ROS安装 参考笔者的博客即可:【ROS】Ubuntu18.04安装Ros 2 Ubuntu18.…

mock.js与组件通信之总线的讲解

目录 一Mock.js 1.1简介 1.2 安装配置Mock.js 1.3 mock.js的使用 二. 组件通信之总线 2.1 总线的简介 2.2 总线的使用-以导航栏的收进为例 好啦今天的分享就到这啦!! 一Mock.js 1.1简介 Mock.js 是一个用于生成随机数据的 JavaScript 库。它可以模拟…

蓄水池抽样算法

题目:在一个源源不断的数据流中,会吐出带有编号的球,现在问你 在不知道具体有多少个球的情况下,如何等概率的抽出10个球? 例题:leetcode 382题 应用场景:比如在某个游戏的抽奖活动中&#xff…