一文搞懂 this 指向

news2024/11/18 23:36:12

在这里插入图片描述


目录

  • 一、前言
  • 二、箭头函数
  • 三、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)); // 输出 8
  console.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 = 17

const 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.coloradmin.cn/o/1039644.html

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

相关文章

Linux 系统死机后挽救措施

一、背景 因我们日常使用Linux系统过程中,会不时遇到系统崩溃的事,但这时系统界面除了呈现一片告警字符外,无发执行任何其他操作,留给我们的要不重启,要不就是尴尬等待指令。那面对会这种情况,还到底有没有…

人工智能热潮推动光芯片与光器件需求飙升

随着人工智能技术的迅猛发展,光芯片和光器件作为关键的基础技术,在这一浪潮下迎来了前所未有的需求增长。光芯片和光器件的高速率、高带宽、低能耗等优势,使其在人工智能应用中发挥着重要作用,正日益成为推动人工智能进步的关键要…

上海长宁来福士P2.5直径4米无边圆形屏圆饼屏圆面屏圆盘屏平面圆屏异形创意LED显示屏案例

长宁来福士广场是一个大型广场,坐落于上海中山公园商圈的核心区域,占地逾6万平方米,其中地上总建筑面积近24万平方米,总投资额约为96亿人民币。 LED圆形屏是根据现场和客户要求定制的一款异形创意LED显示屏,进行文字、…

513找树左下角值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7class Solution { public:int findBottomLeftValue(TreeNode…

RDLC动态设置整个表格是否显示

最近有个新的需求:使用RDLC打印,当数据库中能查出数据时,显示表格。没有数据时,不显示整个表格。 1.首先在RDLC中选中表格的任意一列,右键Tablix属性 2.Tablix属性中选中可见性》选中基于表达式显示或隐藏(E)并点开右…

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中,涉及到大量的公式输入,我们希望能够按照章节为公式进行编号,并且实现公式居中,编号右对齐的效果。网上有各种各样的方法来实现,操作繁琐和简单的混在一起,让没有接触过公…

深度强化学习(三)马尔科夫决策过程

文章目录 马尔可夫过程MP马尔科夫链MC状态转移概率矩阵n步转移概率 马尔科夫链 马尔科夫奖励过程MRP奖励机制计算价值概念定义计算价值推导贝尔曼方程贝尔曼方程实际应用 参考文章:https://blog.csdn.net/taka_is_beauty/article/details/88356375 序贯决策问题是针…

【Vue3 源码解析】nextTick

nextTick 是 Vue 3 中用于异步执行回调函数的函数&#xff0c;它会将回调函数延迟到下一个微任务队列中执行。其中&#xff0c;Vue 更新 DOM 是异步的。下面是对 nextTick 函数的详细解释&#xff1a; export function nextTick<T void, R void>(this: T,fn?: (this:…

2023-09-25 LeetCode每日一题(LFU 缓存)

2023-09-25每日一题 一、题目编号 460. LFU 缓存二、题目链接 点击跳转到题目位置 三、题目描述 请你为 最不经常使用&#xff08;LFU&#xff09;缓存算法设计并实现数据结构。 实现 LFUCache 类&#xff1a; LFUCache(int capacity) - 用数据结构的容量 capacity 初始…

全流量安全分析之服务器非法外连

服务器非法外连监控的重要性在于保护服务器的安全性和防止被黑客利用&#xff0c;以下是几个重要的理由&#xff1a; 1、发现恶意活动&#xff1a;通过监控服务器的外连流量&#xff0c;可以及时发现是否有未经授权或可疑的连接尝试。这可能包括入侵攻击、数据泄露、恶意软件传…

基于微信小程序的家校通系统设计与实现(亮点:选题新颖、上传作业、批改作业、成绩统计)

文章目录 前言运行环境说明家长微信小程序端的主要功能有&#xff1a;教师微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文…

MySQL 索引底层 B+Tree 原理解析

目录 一、前言二、B-Tree 和 BTree 的区别三、InnoDB 和 MyISAM 存储引擎索引存储区别MyISAMInnoDB 四、InnoDB 联合索引底层数据结构五、MySQL 中三次磁盘IO最大能检索多少数据 一、前言 索引是帮助高效获取数据排好序的数据结构&#xff0c;任何数据库都会使用到索引&#x…

漂流伞顾曼宁(顾曼)的创业之路:相信的力量

顾曼宁&#xff08;顾曼&#xff09;的心情在蚂蚁生态全球CEO大会上充满了感动和鼓舞。这是一个期待已久的盛会&#xff0c;时隔三年&#xff0c;蚂蚁生态全球的首席执行官们再次汇聚一堂。智慧与商业的碰撞下&#xff0c;更藏着感情与坚持的交汇。 蚂蚁集团举办了【相信展】的…

求生之路2服务器搭建插件安装及详细的游戏参数配置教程linux

求生之路2服务器搭建插件安装及详细的游戏参数配置教程linux 大家好我是艾西&#xff0c;在上一篇文章中我用windows系统给搭建演示了一遍怎么搭建自己的L4D2游戏。 那么也有不少小伙伴想知道linux系统的搭建方式以及在这个过程中有什么区别。 那么艾西今天就跟大家分享下用lin…

Nginx可视化管理工具结合cpolar实现远程访问内网服务

前言 Nginx Proxy Manager 是一个开源的反向代理工具&#xff0c;不需要了解太多 Nginx 或 Letsencrypt 的相关知识&#xff0c;即可快速将你的服务暴露到外部环境&#xff0c;并且支持 SSL 配置。基于 Tabler 的美观且安全的管理界面,无需了解 Nginx 即可轻松创建转发域、重定…

生产看板管理系统助力车间生产线提升产量、质量

随着制造业的发展和市场竞争的加剧&#xff0c;企业需要寻求创新的生产管理解决方案来提高生产效率和质量。而车间生产看板管理系统正是满足这一需求的理想选择。这种系统通过实时监控生产线上的各项指标&#xff0c;帮助企业及时发现生产问题&#xff0c;并采取相应的措施。通…

【送书活动】《客户成功的力量》——客户成功体系如何构建?请看这7步

文章目录 前言当下客户成功的痛点客户成功体系构建七步法作者简介赠书活动 前言 在中国企业服务领域的发展过程中&#xff0c;客户成功从在中国萌芽开始&#xff0c;行业内外对其讨论几乎没有停止过。近段时间&#xff0c;关于客户成功的讨论再次被业内广泛关注&#xff0c;原因…

微力私人网盘通过cpolar端口映射,成功实现远程访问本地电脑!

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

遥遥领先-华为发布会重磅来袭!我的梦,刘德华...

本次发布会一共涉及了三个头号人物&#xff0c;分别是 1.余承东 2.刘德华 3.何刚 对于很多伙伴期待的手机&#xff0c;本次发布会是没有登场的&#xff0c;也有部分伙伴猜测华为是由于部分原因没有登场。 相信后期将会有有更大的策划和科技登场~ “穿过了黑夜&#xff0c;…

【C语言干货】一秒钟记住52个字母的ASCII码

一、ASCII的介绍 ​​ASCII (American Standard Code for Information Interchange)&#xff1a;美国信息交换标准代码是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准&#xff0c;并等同于国际标准 ISO/IEC 646。…