js进阶——this全面解析

全面解析 this 关键字

在 JavaScript 中,this 是一个经常让初学者困惑的概念。this 的值取决于函数的调用位置,而不是它定义的位置。因此,理解调用位置和不同的绑定规则非常重要。接下来我们详细讲解 this 的各个方面。

1. 调用位置

this 的绑定取决于调用位置,即函数被调用的上下文环境。调用位置是决定 this 如何绑定的关键。

function show() {console.log(this);
}show(); // 在全局环境中调用,this 默认绑定到全局对象 (浏览器中为 window)
2. this 绑定规则
2.1 默认绑定

默认绑定是最基本的规则。在非严格模式下,如果函数直接调用,this 将绑定到全局对象(在浏览器中是 window)。在严格模式下(use strict),this 会绑定为 undefined

function foo() {console.log(this); 
}foo(); // 非严格模式下 this 是 window,严格模式下 this 是 undefined
2.2 隐式绑定

当函数作为对象的方法调用时,this 会被绑定到该对象。也就是说,调用该函数的对象是 this 的值。

const obj = {name: 'Alice',show() {console.log(this.name);}
};obj.show(); // 输出 'Alice', this 绑定到 obj
2.3 显示绑定

通过 callapplybind 方法,可以手动指定 this 的值,这称为显示绑定

  • call:直接调用函数并指定 this
  • apply:类似于 call,但传递参数是以数组形式。
  • bind:返回一个新的函数,并永久绑定 this
function greet() {console.log(this.name);
}const person = { name: 'Bob' };greet.call(person); // 显式绑定 this,输出 'Bob'
greet.apply(person); // 输出 'Bob'
const boundGreet = greet.bind(person);
boundGreet(); // 输出 'Bob'
2.4 new 绑定

当通过 new 关键字调用函数时,会创建一个新的对象,并且这个对象会绑定到 this。同时,新创建的对象会被自动返回。

function Person(name) {this.name = name;
}const alice = new Person('Alice');
console.log(alice.name); // 输出 'Alice'
3. this 绑定的优先级

当多个规则同时出现时,this 的绑定优先级如下:

  1. new 绑定:如果使用了 new 关键字,this 会被绑定到新创建的对象。
  2. 显式绑定callapplybind 的显示绑定优先级高于隐式绑定和默认绑定。
  3. 隐式绑定:如果函数作为对象的方法调用,this 会绑定到该对象。箭头函数除外
  4. 默认绑定:如果没有特殊的绑定规则,this 会绑定到全局对象(非严格模式)或 undefined(严格模式)。

例子:

function foo() {console.log(this.name);
}const obj1 = { name: 'obj1', foo };
const obj2 = { name: 'obj2' };foo.call(obj2); // 显示绑定到 obj2,输出 'obj2'
obj1.foo(); // 隐式绑定到 obj1,输出 'obj1'
4. 绑定例外
4.1 被忽略的 this

如果通过 nullundefined 显式绑定 this,在调用时会忽略这种绑定,this 将会回退到默认绑定。

function foo() {console.log(this);
}foo.call(null); // 在非严格模式下 this 会绑定到全局对象,严格模式下 this 是 undefined
4.2 间接引用

当将对象的方法赋值给另一个变量时,this 的绑定会丢失,回退到默认绑定。

const obj = {name: 'Alice',greet() {console.log(this.name);}
};const greetFunc = obj.greet;
greetFunc(); // this 绑定丢失,回退到默认绑定 (全局对象/undefined)
4.3 软绑定

通过自定义函数,可以创建一个软绑定 this 的方案。如果 thisnullundefined,则 this 会被绑定到指定的默认对象。

if (!Function.prototype.softBind) {Function.prototype.softBind = function(obj) {const fn = this;return function() {return fn.apply((!this || this === global) ? obj : this, arguments);};};
}function foo() {console.log(this.name);
}const person = { name: 'Alice' };
const softBoundFoo = foo.softBind(person);
softBoundFoo(); // 输出 'Alice'
5. this 词法

箭头函数没有自己的 this 绑定。箭头函数中的 this 是从定义它的上下文继承而来的,而不是调用时确定的。

const obj = {name: 'Alice',arrowFunc: () => {console.log(this.name); // 由定义它的上下文继承而来的,所以箭头函数中的 this 绑定到外部作用域,也就是全局window,obj此时还没有形成自己的上下文,因为obj的定义还没结束},normalFunc() {console.log(this.name); // 普通函数的 this 绑定到 obj}
};obj.arrowFunc(); // 输出 undefined(取决于外部作用域的 this)
obj.normalFunc(); // 输出 'Alice'
6. 小结
  • this 的值取决于函数的调用位置。
  • 绑定规则分为:默认绑定、隐式绑定、显示绑定和 new 绑定。
  • 不同绑定规则有优先级,其中 new 绑定优先于显式绑定,显式绑定优先于隐式绑定。
  • 例外情况包括:被忽略的 this、间接引用和软绑定。
  • 箭头函数的 this 由外部词法作用域决定,不依赖调用时的上下文。

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

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

相关文章

Java : 图书管理系统

图书管理系统的作用: 高效的图书管理 图书管理系统通过自动化管理,实现了图书的采编、编目、流通管理等操作的自动化处理,大大提高了图书管理的效率和准确性。 工作人员可以通过系统快速查找图书信息,实时掌握图书的借还情况&…

【Java】Java中接口与内部类详解

目录 引言 一、接口(Interface) 1.1 接口的定义 1.1.1 接口的特点 1.2 接口的实现 1.3 接口的继承 1.4 接口的注意事项 1.5 代码示例 二、内部类(Inner Class) 2.1 内部类特点 2.2 成员内部类 2.2.1 对象的创建 2.…

红外热成像应用场景!

1. 电力行业 设备故障检测:红外热成像仪能够检测电气设备(如变压器、电线接头)的过热现象,及时发现并定位故障点,预防火灾等安全事故的发生。 水电站查漏:在水电站中,红外热成像仪可用于快速查…

【LLM学习之路】9月22日 第九天 自然语言处理

【LLM学习之路】9月22日 第九天 直接看Transformer 第一章 自然语言处理 自然语言处理发展史 只要看的足够多,未必需要理解语言 统计语言模型发展史 统计语言模型: 判断一个句子是否合理,就计算这个句子会出现的概率 缺点是句子越长越…

掌握Python办公自动化,轻松成为职场高效达人

大家好,今天我们来聊聊为什么要学习和了解Python办公自动化? "自动化应用于高效运营将提高效率" ——比尔盖茨 在日常的工作中,存在很多重复性、规律性的工作。虽然现在有很多办公软件能够在一些方面提高工作效率,但无法…

基于FPGA+GPU异构平台的遥感图像切片解决方案

随着遥感和成像技术的不断进步和普及,获取大量高分辨率的遥感图像已成为可能。这些大规模的遥感图像数据需要进行有效的处理和分析,以提取有用的信息,进行进一步的应用。遥感图像切片技术应运而生,该技术可以将大型遥感图像分割成…

python-在PyCharm中使用PyQt5

文章目录 1. 安装 PyQt5 和QtTools2. QtDesigner 和 PyUIC 的环境配置2.1 在 PyCharm 添加 Create Tools2.2 添加 PyUIC 工具 3. 创建ui界面4. 使用python调用ui界面参考文献 1. 安装 PyQt5 和QtTools QT 是最强大的 GUI 库之一,PyQt5 是 Python 绑定 QT5 应用的框…

增强GPT4v的Grounding能力,video-level

开源链接: appletea233/AL-Ref-SAM2: AL-Ref-SAM 2: Unleashing the Temporal-Spatial Reasoning Capacity of GPT for Training-Free Audio and Language Referenced Video Object Segmentation (github.com) In this project, we propose an Audio-Language-Refe…

手写数字识别案例分析(torch,深度学习入门)

在人工智能和机器学习的广阔领域中,手写数字识别是一个经典的入门级问题,它不仅能够帮助我们理解深度学习的基本原理,还能作为实践编程和模型训练的良好起点。本文将带您踏上手写数字识别的深度学习之旅,从数据集介绍、模型构建到…

vue Echart使用

一、在vue中使用Echarts 1.安装Echarts npm install echarts --save2.准备一个呈现图表的盒子 给盒子起名字是建议使用id选择器 这个盒子通常来说就是我们熟悉的 div &#xff0c;这个 div 决定了图表显示在哪里&#xff0c;盒子一定要指定宽和高 <div id"main&quo…

性能测试问题诊断-接口耗时高

问题现象&#xff1a;近期发现每晚跑的定时压测任务&#xff0c;压测结果中&#xff0c;各接口耗时变高&#xff08;原来99耗时<3秒&#xff0c;当前99耗时>20秒)。 问题排查&#xff1a; 查看jmeter 生成的结果图&#xff0c;发现压测2分钟后出现接口耗时变高情况。如下…

【ShuQiHere】 探索数据挖掘的世界:从概念到应用

&#x1f310; 【ShuQiHere】 数据挖掘&#xff08;Data Mining, DM&#xff09; 是一种从大型数据集中提取有用信息的技术&#xff0c;无论是在商业分析、金融预测&#xff0c;还是医学研究中&#xff0c;数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…

如何快速上手一个Github的开源项目

程序研发领域正是有一些热衷开源的小伙伴&#xff0c;技能迭代才能如此的迅速&#xff0c;因此&#xff0c;快速上手一个GitHub上的开源项目&#xff0c;基本上已经变成很个程序员小伙伴必须掌握的技能&#xff0c;因为终究你会应用到其中的一个或多个项目&#xff0c;帮助自己…

【计算机网络篇】电路交换,报文交换,分组交换

本文主要介绍计算机网络中的电路交换&#xff0c;报文交换&#xff0c;分组交换&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 &#x1f3af;一.划分…

【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】

卸载 MySQL 参考文章&#xff1a; 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd &#xff0c;切换到 MySQL 安装目录的 bin 文件夹下&#xff0c;执行如下命令&#xff0c;删除 MySQL 服务mys…

Blender软件三大渲染器Eevee、Cycles、Workbench对比解析

Blender 是一款强大的开源3D制作平台&#xff0c;提供了从建模、雕刻、动画到渲染、后期制作的一整套工具&#xff0c;广泛应用于电影、游戏、建筑、艺术等领域。 渲染101云渲染云渲6666 相比于其他平台&#xff0c;如 Autodesk Maya、3ds Max 或 Cinema 4D&#xff0c;Blende…

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

C++ 进阶之路:非类型模板参数、模板特化与分离编译详解

目录 非类型模版参数 类型模板参数 非类型模板参数 非类型模板参数的使用 模板的特化 函数模板的特化 类模板的特化 全特化与偏特化 偏特化的其它情况 模板的分离编译 什么是分离编译 为什么要分离编译 为什么模板不能分离编译 普通的类和函数都是可以分离编译的…

【学习笔记】数据结构(六 ①)

树和二叉树 &#xff08;一&#xff09; 文章目录 树和二叉树 &#xff08;一&#xff09;6.1 树(Tree)的定义和基本术语6.2 二叉树6.2.1 二叉树的定义1、斜树2、满二叉树3、完全二叉树4、二叉排序树5、平衡二叉树&#xff08;AVL树&#xff09;6、红黑树 6.2.2 二叉树的性质6.…

通用大模型 vs 垂直大模型:谁将赢得AI战场?

引言 在人工智能领域&#xff0c;大模型的快速发展引发了广泛的关注和讨论。大模型&#xff0c;尤其是基于深度学习和海量数据训练的模型&#xff0c;已经在多个领域展现出强大的能力。从自然语言处理、图像识别到自动驾驶和医疗诊断&#xff0c;AI大模型正深刻改变着我们的生…