揭开`this`的神秘面纱:探索 JavaScript 中的上下文密钥(上)

news2024/11/24 13:06:41

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍`this`关键字在 JavaScript 中的重要性。
  • 二、`this`的基本概念
    • 解释`this`的定义和作用。
  • 三、不同的绑定方式
    • 介绍`this`的四种绑定方式:默认绑定、隐式绑定、显式绑定和 new 绑定。

一、引言

介绍this关键字在 JavaScript 中的重要性。

this 关键字在 JavaScript 中具有非常重要的作用,它用于表示当前执行上下文对象,即当前函数所在的对象

this 关键字可以用来访问对象的属性和方法,以及调用对象的方法和访问对象的属性。

this 关键字在 JavaScript 中具有以下重要性:

  1. 确定当前对象的属性:在 JavaScript 中,可以使用 this 关键字来访问对象的属性。例如,this.name 可以用来访问对象的 name 属性。

  2. 调用对象的方法:在 JavaScript 中,可以使用 this 关键字来调用对象的的方法。例如,this.sayHello() 可以用来调用对象的 sayHello 方法。

  3. 访问原型链上的属性和方法:JavaScript 中每个对象都有一个原型链,可以通过 this 关键字访问原型链上的属性和方法。例如,this.prototype.age 可以用来访问原型链上的 age 属性。

  4. 避免全局变量和全局函数:使用 this 关键字可以避免全局变量和全局函数的命名冲突和代码污染。例如,可以使用 varlet 关键字定义全局变量,但是不能直接使用全局变量,而是需要使用 this 关键字访问。

  5. 访问闭包中的变量和方法:在 JavaScript 中,闭包中的变量和方法是私有的,不能直接访问。但是,可以使用 this 关键字访问闭包中的变量和方法。例如,this.counter 可以用来访问闭包中的 counter 变量。

  6. 避免函数嵌套:在 JavaScript 中,函数嵌套会导致函数内部的变量被覆盖,从而无法访问。但是,使用 this 关键字可以避免函数嵌套的问题。例如,var counter = 0;var counter = 0; 定义了两个变量,但是使用 this 关键字可以避免变量被覆盖的问题。

综上所述,this 关键字在 JavaScript 中具有非常重要的作用,它可以帮助我们访问对象的属性和方法,调用对象的方法和访问对象的属性,访问原型链上的属性和方法,避免全局变量和全局函数的命名冲突和代码污染,访问闭包中的变量和方法,以及避免函数嵌套的问题。因此,在 JavaScript 中,我们需要熟练掌握 this 关键字的重要性,并正确地使用它来处理对象和函数之间的关系。

二、this的基本概念

解释this的定义和作用。

this 是一个 JavaScript 关键字,它用于表示当前执行上下文对象
在函数中,this 的值取决于函数是否被作为构造函数调用,或者是否被作为普通函数调用

1. 当函数作为构造函数被调用时:

如果函数被作为构造函数调用,那么 this值会自动绑定到新创建的对象上。例如:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

var person = new Person("张三", 25);
console.log(person.name); // 输出 "张三"

在这个例子中,Person 函数作为构造函数被调用,创建了一个新的 Person 对象。由于 this 的值自动绑定到新创建的对象上,因此 this.namethis.age 分别被绑定到对象的 nameage 属性上。

2. 当函数作为普通函数被调用时:

如果函数被作为普通函数调用,那么 this值会指向全局对象(通常是 window 对象)。例如:

function sayHello() {
  console.log("Hello, world!");
}

sayHello(); // 输出 "Hello, world!"

在这个例子中,sayHello 函数作为普通函数被调用,由于 this 的值指向全局对象,因此 console.log 中的 "Hello, world!" 被输出到全局对象 window 上。

3. 当函数作为参数传递给另一个函数时:

如果函数作为参数传递给另一个函数,那么 this 的值会指向接收函数的 this 值。例如:

function logMessage(message) {
  console.log(message);
}

var logMessage = logMessage;
logMessage("Hello, world!"); // 输出 "Hello, world!"

在这个例子中,logMessage 函数被作为参数传递给另一个函数 logMessage,由于接收函数的 this 值指向全局对象 window,因此 logMessage 中的 console.log 中的 "Hello, world!" 被输出到全局对象 window 上。

综上所述,this 是一个非常重要的关键字,它可以帮助我们访问对象的属性和方法,调用对象的方法和访问对象的属性,以及确定函数的执行上下文。因此,在 JavaScript 中,我们需要熟练掌握 this 的定义和作用,并正确地使用它来处理对象和函数之间的关系。

三、不同的绑定方式

介绍this的四种绑定方式:默认绑定、隐式绑定、显式绑定和 new 绑定。

在 JavaScript 中,this 有四种绑定方式,分别是默认绑定、隐式绑定、显式绑定和 new 绑定。这四种绑定方式分别适用于不同的场景,下面我们来详细介绍这四种绑定方式。

  1. 默认绑定(Function 函数默认绑定)

当函数作为普通函数调用时,this 的默认绑定方式是全局对象(通常是 window 对象)。例如:

function sayHello() {
 console.log("Hello, world!");
}

sayHello(); // 输出 "Hello, world!"

在这个例子中,sayHello 函数作为普通函数被调用,由于 this 的默认绑定方式是全局对象,因此 console.log 中的 "Hello, world!" 被输出到全局对象 window 上。

  1. 隐式绑定(函数内变量默认绑定)

在函数内部,如果变量没有被赋值,它会自动绑定到 this。例如:

function sayHello() {
 console.log(this);
}

sayHello(); // 输出 window

在这个例子中,sayHello 函数内部的 this 指向全局对象 window,因此 console.log 中的输出结果是 window

  1. 显式绑定(使用 call 方法或 apply 方法显式绑定)

我们可以使用 call 方法或 apply 方法来显式地绑定 this。例如:

function sayHello() {
 console.log(this);
}

sayHello.call(null); // 输出 undefined
sayHello.call(window); // 输出 window

在这个例子中,我们使用 call 方法将 this 显式地绑定到全局对象 window 上,因此 console.log 中的输出结果是 window

function sayHello() {
 console.log(this);
}

sayHello.apply(null); // 输出 undefined
sayHello.apply(window); // 输出 window
  1. new 绑定(使用 new 关键字创建对象时绑定)

当我们使用 new 关键字创建对象时,this 会自动绑定到新创建的对象上。例如:

function Person(name, age) {
 this.name = name;
 this.age = age;
}

var person = new Person("张三", 25);
console.log(person.name); // 输出 "张三"

在这个例子中,我们使用 new 关键字创建了一个 Person 对象,因此 this 的绑定方式是该对象本身。因此,我们在函数内部使用 this.name 可以正确地访问对象的属性。

总结一下,四种绑定方式分别是:

  1. 默认绑定(Function 函数默认绑定):当函数作为普通函数调用时,this 的默认绑定方式是全局对象(通常是 window 对象)。
  2. 隐式绑定(函数内变量默认绑定):在函数内部,如果变量没有被赋值,它会自动绑定到 this
  3. 显式绑定(使用 call 方法或 apply 方法显式绑定):我们可以使用 call 方法或 apply 方法来显式地绑定 this
  4. new 绑定(使用 new 关键字创建对象时绑定):当我们使用 new 关键字创建对象时,this 会自动绑定到新创建的对象上。

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

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

相关文章

mysql远程执行sql语句过长 包太大,出现提示“ERROR Got a packet bigger than XXXX”解决

也可以单条执行,虽然慢些。 set global max_allowed_packet10241024100 这条命令 set global max_allowed_packet1024*1024*100 是用于MySQL数据库的。它用来设置max_allowed_packet参数的值,这个参数决定了MySQL服务器可以接收的最大数据包大小。 在…

考研英语一图表作文必背模版句

英语一的作文还是很靠日常积累的,依据潘赟老师的九宫格理论: 2——图画描述5——意义论证8——建议措施 这3个模块式最为核心也是最容易拉开分差的,对于时间有限的同志不建议忙下功夫浪费时间,而对于另外6个模块,还是…

【亲测好用】DevC++编译出现‘项目没有调试信息,您想打开项目调试选项并重新生成吗’完美解决

DevC不能正常编译 问题描述问题解决 问题描述 问题解决 工具->编译选项 编译器 添加 -g3 在下面命令框 代码生成/优化->链接器->将下面产生调试信息改为Yes 打开调试信息显示(工具->环境选项->浏览Debug变量打开) 最后一定一定要重新点击…

麒麟操作系统自学1-麒麟操作系统概述

一、麒麟操作系统概述 1、什么是操作系统? 操作系统(operation system,简称OS)是管理硬件资源和软件资源的程序,是计算机系统的核 心。操作系统由操作系统内核和提供基础服务的其他系统软件组成。 2、国产操作系统 国…

php hyperf 读取redis,存储到数据库

redis中排行榜中的数据 public function execute(string $date){$query ChannelConfig::query();$query->where(module_name, rank_reward);$rewardData $query->first();$rewards [];if( $rewardData ){$rewardContents $rewardData->content;foreach ($rewardC…

认识缓存,一文读懂Cookie,Session缓存机制。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

2023NEFU实习项目解析 - 中俄贸易供需服务平台

文章目录 项目概述项目初始化搭建项目初始框架配置Tomcat建立项目数据库编写统一返回类及其工具类编写数据库工具类通过Filter解决Response返回中文乱码问题使用Filter解决权限校验问题 项目主干开发用户登录企业管理(分页查询原生实现)上传VIP申请书模板…

设计模式—装饰模式

与其明天开始,不如现在行动! 文章目录 装饰模式—穿衣服💎总结 装饰模式—穿衣服 装饰模式(Decorator)可以动态的给对象添加一些额外的职责。 Component是定义一个对象接口,可以给这些对象动态地添加职责。…

实现Springboot的自动装配

首先我们有一个模块叫testOne 该模块就只定义一个类UserService。 我们要将UserService自动装配到Springboot中。 一下是testOne的各个文件。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM…

11.OSPF

OSPF 比较常用的路由协议 主要用在内部网络 它看的是链路的带宽&#xff0c;不仅仅看距离远近 rip收敛较慢&#xff0c;OSPF时间在10秒就可以完成收敛 区域0 表示骨干区域&#xff0c;其他的都是常规区域 ABR&#xff1a;连接骨干区域与常规区域的路由器称为区域边界路由器 r…

【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

目录 前言一、基于fabric8io操作pod1.1 yaml创建pod1.2 fabric8io创建pod案例 二、基于fabric8io创建Service&#xff08;含Deployment&#xff09;2.1 yaml创建Service和Deployment2.2 fabric8io创建service案例 三、基于fabric8io操作Volume3.1 yaml配置挂载存储卷3.2 基于fa…

Android Termux安装MySQL数据库并通过内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

针对这两个趋势,3.0全新新零售商业模式可以采取以下策略:

国内市场确实存在“消费升级”和“消费降级”两个趋势&#xff0c;这是由于不同消费者群体的需求和购买力存在差异。消费升级主要发生在高端市场&#xff0c;消费者愿意为高品质、高价值、高价格的商品和服务付出更多。而消费降级则主要发生在中低端市场&#xff0c;消费者更加…

041.Python异常处理_初识异常

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

共享门店会在未来新零售占据主角吗?

共享门店作为一种创新的商业模式&#xff0c;在未来新零售领域中可能会占据一定的角色&#xff0c;但具体是否会成为主角&#xff0c;还需要根据市场的发展和技术的进步来判断。 首先&#xff0c;共享门店模式通过资源共享、风险共担、客户共享和收益共享等方式&#xff0c;为…

手机大厂的自由窗口freeform功能基于aosp14/安卓14适配完成-千里马android framework实战开发

背景 hi&#xff0c;粉丝朋友们&#xff1a; 今年2023年已经块过去了&#xff0c;各个手机厂商已经开始适配aosp14&#xff0c;甚至有的是已经适配完成&#xff0c;明年市场就大部分手机出厂就都是android 14了。 近期有个马哥学员刚好求助马哥一个关于以前马哥课程里面自由窗…

2.初始化Server、Common工程

1.初始化项目结构 1.1 工程依赖关系 1.2 根pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

vue3使用vue-router嵌套路由(多级路由)

文章目录 1、Vue3 嵌套路由2、项目结构3、编写相关页面代码3.1、编写route文件下 index.ts文件3.2、main.ts文件代码&#xff1a;3.3、App.vue文件代码&#xff1a;3.4、views文件夹下的Home文件夹下的index.vue文件代码&#xff1a;3.5、views文件夹下的Home文件夹下的Tigerhh…

Android通过listview实现输入框自定义提示栏(代替AutoCompleteTextView自动完成文本框)

效果图 背景 本人因为一些需求初次接触android&#xff0c;需要实现一个类似android自带的AutoCompleteTextView&#xff08;自动完成文本框&#xff09;&#xff0c;但和其不同的是通过后端接口直接筛选数据&#xff08;自己的分词处理规则&#xff09;&#xff0c;然后返回前…

【LeetCode刷题笔记(5)】【Python】【盛最多水的容器】【双指针】【中等】

文章目录 盛最多水的容器算法题描述示例示例 1示例 2 提示题意拆解 解决方案&#xff1a;【双指针】运行结果复杂度分析 结束语 盛最多水的容器 盛最多水的容器 算法题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (…