js进阶——this全面解析

news2024/9/25 2:19:03

全面解析 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.coloradmin.cn/o/2162129.html

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

相关文章

Kivy,一个上天入地的 Python 库

大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。 一个简单的库,也许能够开启我们的智慧之门, 一个普通的方法,也许能在危急时刻挽救我们于水深火热, 一个新颖的思维方式,也许能…

USB 电缆中的信号线 DP、DM 的缩写由来

经常在一些芯片的规格书中看到 USB 的信号对是以 DP 和 DM 命名: 我在想,这些规格书是不是写错了,把 N 写成 M 了?DM 中的 M 到底是什么的缩写? 于是我找了一些资料,终于在《Universal Serial Bus Cables …

string 的介绍及使用

一.string类介绍 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理&a…

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

ssm病人跟踪治疗信息管理系统

专业团队,咨询就送开题报告,欢迎大家咨询留言 摘 要 病人跟踪治疗信息管理系统采用B/S模式,促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段,管理效率极低,随着病人的不断…

《SG-Former: Self-guided Transformer with Evolving Token Reallocation》ICCV2023

摘要 SG-Former(Self-guided Transformer)是一种新型的视觉Transformer模型,旨在解决传统Transformer在处理大型特征图时面临的计算成本高的问题。该模型通过一种自适应细粒度的全局自注意力机制,实现了有效的计算成本降低。它利…

VmWare安装虚拟机教程(centos7)

VMWare下载: 下载 VMware Workstation Pro - VMware Customer Connect 安装包:(16的版本)免费!(一个赞就行) 一直点下一步即可,注意修改一下安装位置就好 二、安装虚拟机 安装虚…

鸭脖变“刺客”,啃不起了

撰文|ANGELICA 编辑|ANGELICA 审核|烨 Lydia 声明|图片来源网络。日晞研究所原创文章,如需转载请留言申请开白。 你有多久没吃卤味了? 2020年之后,人们对于几大卤味巨头的关注度正在下降。 …

视频字幕生成:分享6款专业易操作的工具,让创作更简单!

​视频字幕如何添加?日常剪辑Vlog视频时,就需要给视频添加上字幕了。字幕是一个比较重要的元素,它不仅可以帮助听力受损或语言障碍的人士理解内容,还可以让你的视频更加易于理解和吸引观众。 那么如何实现视频字幕生成&#xff0c…

【LLaMa2入门】从零开始训练LLaMa2

目录 1 背景2 搭建环境2.1 硬件配置2.2 搭建虚拟环境2.2.1 创建虚拟环境2.2.2 安装所需的库 3 准备工作3.1 下载GitHub代码3.2 下载模型3.3 数据处理3.3.1 下载数据3.3.2 数据集tokenize预处理 4 训练4.1 修改配置4.2 开始训练4.3 多机多卡训练 5 模型推理5.1 编译5.1.1 安装gc…

ResNet18模型扑克牌图片预测

加入会员社群,免费获取本项目数据集和代码:点击进入>> 1. 项目简介 该项目旨在通过深度学习技术,使用ResNet18模型对扑克牌图像进行预测与分类。扑克牌图片分类任务属于图像识别中的一个应用场景,要求模型能够准确识别扑克…

【python篇】python pickle模块一篇就能明白,快速理解

持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象。通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识。另外,还会让您更深一步地了解Python 的对象…

音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.flv 可以判断出某个文件是否为FLV文件: 所以FFmpeg是怎样判断出某个文件是否为FLV文件呢?它内部其实是通过flv_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…

Serilog文档翻译系列(五) - 编写日志事件

日志事件通过 Log 静态类或 ILogger 接口上的方法写入接收器。下面的示例将使用 Log 以便语法简洁,但下面显示的方法同样可用于接口。 Log.Warning("Disk quota {Quota} MB exceeded by {User}", quota, user); 通过此日志方法创建的警告事件将具有两个相…

mes系统在中小企业智能制造作用

MES系统(制造执行系统)在中小企业智能制造中扮演着至关重要的角色,其作用主要体现在以下几个方面: 1. 提升生产效率与质量 实时监控与数据采集:MES系统能够实时采集生产现场的各项数据,如设备状态、生产进…

nmap 命令:网络扫描

一、命令简介 ​nmap​(Network Mapper)是一个开放源代码的网络探测和安全审核的工具。它最初由Fyodor Vaskovich开发,用于快速地扫描大型网络,尽管它同样适用于单个主机。 ​nmap​的功能包括: 发现主机上的开放端…

电信、移动、联调等运营商都有那些国产化自研软件

国产化自研软件方面有着积极的探索和实践,包括操作系统、数据库和中间件等,电信运营商在国产化软件方面取得了显著进展: 操作系统: 中国电信推出了基于华为欧拉openEuler开源系统的天翼云操作系统CTyunOS,已上线部署5万…

【2024W38】肖恩技术周刊(第 16 期):白嫖AI的最佳时段

周刊内容: 对一周内阅读的资讯或技术内容精品(个人向)进行总结,分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率,每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

asp.net core日志与异常处理小结

asp.net core的webApplicationBuilder中自带了一个日志组件,无需手动注册服务就能直接在控制器中构造注入,本文主要介绍了net core日志与异常处理小结,需要的朋友可以参考下 ILogger简单使用 asp.net core的webApplicationBuilder中自带了一个日志组件…

Elasticsearch可视化工具ElasticHD

目录 介绍 ElasticHD应用程序页面 安装 基本用法 独立可执行文件 ES版本支持 SQL特性支持: 超越SQL功能支持: SQL的用法 Docker快速入门: 下载地址 介绍 ElasticHD是ElasticSearch可视化管理工具。它不需要任何软件。它在您的Web浏览器中工作,允许您随时随地管理…