(前端)面试300问之(3)this的指向判断

news/2025/1/16 5:54:43/

一、this的相关理解与解读

1、各角度看this。

1)ECMAScript规范:

this 关键字执行为当前执行环境的 ThisBinding。

2)MDN:

In most cases, the value of this is determined by how a function is called.
在绝大多数情况下,函数的调用方式决定了this的值。

3)其实,没必要记这些文邹邹的句子去理解【哎,很多我们懂的词语放在同一个句子里,我们可能就读不懂其意思了】。

我们只需记住一个魔法口诀 ------ “this 永远指向最后调用它的那个对象” 就能理解 this 的指向问题。

二、this指向的判断。

1、this指向的判断流程图:


判断this指向.png

2、具体的例子:

1)普通函数 && 通过new关键字进行创建的:
class O {constructor(name) {this.name = name;}getName(){console.log(this);}
}let o = new O('码农三少');
o.getName(); // {name: "码农三少"}
2)普通函数 && !通过new关键字进行创建 && 函数调用中使用上下文对象:
function fn() {console.log(this);
}let o = {name: '码农三少',fn: fn
}window.fn();    // 上下文对象调用, 等价于直接调用 fn()。 {window: Window, self: Window, document: document, name: "", location: Location, ...}
o.fn();       // 上下文对象调用。 {name: "码农三少", fn: ƒ}
3)普通函数 && !通过new关键字进行创建 && !函数调用中使用上下文对象:
function fn() {console.log(this);
}let o = {name: '码农三少',fn: fn
}
let newFn = o.fn;
newFn(); // 等同于 window.fn(); 和 fn(); 。 {window: Window, self: Window, document: document, name: "", location: Location, ...}
4)箭头函数(指向它外层普通函数的this指向):
let o = {name: '码农三少',fn() {return () => {console.log(this)}}
}let newFn = o.fn();
newFn(); // 这2行等价于 o.fn()(); 。{name: "码农三少", fn: ƒ}
5)使用了特殊函数(如bind、apply、call):
function fn() {console.log(this);
}let bindObj = {name: '我是 bindObj , By 码农三少'
};let applyObj = {name: '我是 applyObj , By 码农三少'
};let callObj = {name: '我是 callObj , By 码农三少'
};fn(); // 等价于 window.fn(); Window {window: Window, self: Window, document: document, name: "", location: Location, ...}
fn.bind(bindObj)(); // {name: "我是 bindObj , By 码农三少"}
fn.apply(applyObj); // {name: "我是 applyObj , By 码农三少"}
fn.call(callObj); // {name: "我是 callObj , By 码农三少"}

喜欢的朋友记得点赞、收藏、关注哦!!!


http://www.ppmy.cn/news/1520640.html

相关文章

嵌入式硬件-ARM处理器架构,CPU,SOC片上系统处理器

多进程空间内部分布图:注意:创建线程实际使用堆区空间,栈区独立 ARM处理器架构: 基于ARM920T架构的CPU:以下为哈佛结构 ALU:算数运算器 R0~R12:寄存器 PC:程序计数器,默认为0,做自加运算&#x…

kafka单条消息过大发送失败

一、背景 生产环境中使用kafka作为消息队列,生产者发送消息失败,查询报错日志,得到如下输出: Caused by: org.springframework.kafka.KafkaException: Send failed; nested exception is org.apache.kafka.common.errors.RecordT…

JSON格式化?超简单!

JSON格式化 是指将JSON(JavaScript Object Notation)数据转换成一种更易读、结构化的格式。 在以下场景中,可能需要进行JSON格式化: 调试和开发:在开发过程中,开发人员经常需要查看和解析JSON数据。通过…

基于深度学习的遥感图像分类识别系统,使用PyTorch框架实现

取5个场景 [海滩, 灌木丛, 沙漠, 森林, 草地] 划分数据集 train:val:test 7:2:1 环境依赖 pytorch1.1 or 1.0 tensorboard1.8 tensorboardX pillow 注意调低batch_size参数特别是像我这样的渣渣显卡 使用方法 只需要指…

如何快速采集淘宝商品数据?

无论是谁,如果单凭人工的方式去收集淘宝、天猫等平台的商品数据信息,工作量是巨大的,如果借助有采集软件的第三方公司操作,则可实现对大数据的轻松掌握,但是外包给第三方公司需要支付一定的费用,包含技术费…

Canvas 在 微信小程序-uni-APP 和 H5 中的使用差异

Canvas 是一个强大的绘图工具,无论是在 Web 开发还是跨平台应用开发中都有广泛应用。然而,在 uni-APP 和传统 H5 环境中使用 Canvas 时,存在一些重要的差异。本文将深入探讨这些差异,帮助开发者在不同平台上更好地使用 Canvas。 1. API 差异 H5 环境 在 H5 环境中,我们使用标…

十四、低空安全综合管理服务平台建设方案

1、系统背景 由于低空安全研究关系到国家战略安全保障,世界各国相继开展了相关法律法规建设,以及一系列的理论与技术保障研究。为了保障低空空域安全,需推动建立各省级安全管理平台,做好与企业级监控服务平台的管理衔接和数据共享,强化本区域内民用无人机的安全监管工作;…

vue大屏可视化:4k带鱼屏、4k、2k、1920*1080、笔记本 全适配方案

本方案采用的是媒体查询的方法来实现的 css媒体查询书写(可按照自己需求新增)不同尺寸下显示不同的文字大小图片大小等: // 4K 带鱼屏 media screen and (max-width: 3840px) and (max-height: 1080px) {} // 4K media screen and (max-widt…