JS中 this的指向问题

JavaScript:this指向问题、同步和异步、 JS执行机制、location对象 this this 的指向在函数定义的时候 是确定不了的 只有函数执行的时候才能确定this指向谁 一般情况下 this 的最终指向的是那个调用它的对象 .全部作用域或者普通作用函数中 this指向全局对象window (定时器里面的 this指向window) 方法调用中 谁调用this指向谁 构造函数this指向构造函数 <body> <button> 按钮</button> <script> // this 指向问题 阅读详情

this的指向已经是一个老生常谈的问题,每逢面试都要去复习复习,近来巩固js的基础,决心彻底掌握这个知识点,一劳永逸。说明一下,为了不影响大家的思考过程,下面的代码都不会去注释答案,想知道答案,只需要去控制台执行一下。

四类场景逐一击破

首先,分析this的指向共有四种类型,在分析之前,我们首先带好两个锦囊:
1.函数被调用时(即运行时)才会确定该函数内this的指向。因为在函数中this与arguments是两个特殊的变量,在函数被调用时才会取得它们,而且搜索这两个变量时只会在活动对象范围里面去搜。(有关活动对象与变量对象的知识,请移步到js 中的活动对象 与 变量对象 什么区别?)
2.要确定函数中this的指向,必须先找到该函数被调用的位置。

认准第一种“test()”形式

var a = 1
function test () {
    console.log(this.a)
}
test()

直接不带任何引用形式去调用函数,则this会指向全局对象,因为没有其他影响去改变this,this默认就是指向全局对象(浏览器是window,Node中是global)的。这个结论是在非严格模式的情况下,严格模式下这个this其实是undefined的。

认准第二种“xxx.test()”形式

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
obj.test()

这种形式对比起第一种,很明显test()已经是名花有主的了!看清楚,是谁呼唤的test()?没错,就是obj,所以this的指向就不言而喻了。一句话,谁去调用这个函数的,这个函数中的this就绑定到谁身上。

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
var obj0 = {
    a: 3,
    obj 
}
obj0.obj.test()

即使是这种串串烧的形式,结果也是一样的,test()中的this只对直属上司(直接调用者obj)负责。再来看一个综合点的例子:

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
var testCopy = obj.test
testCopy()

嗯,聪明的你一定想到,换了个名字就能骗到我了!?虽然经过了一波改名换姓,但本质上还不是obj.test()嘛!结果一定和上面一样!唔,请F12在控制台试试,竟然……其实这里并不需要去思考什么,按照我们的套路,我们就认函数调时的样子,有没有看到最后调用的时候跟第一种情况一毛一样?我再介绍一个场景大家一定不会觉得陌生:

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
setTimeout(obj.test)

你可以意淫一下setTimeout的本质,是不是相当于有一个setTimeout函数,接收两个参数:

function setTimeout (fn, time) {
    // 这里干了一大波不可描述的事情,最后会去调一下你传进来的回调函数
    fn()
}

看到怎样调用你传进来的函数了吗!?再想想我们第一种形式的标题认准第一种“test()”形式。

认准第三种“test.call(xxx) / test.apply(xxx) / test.bind()”形式

看了上面两种形式之后,你可能会想,我非常讨厌上面那些矫情的扭扭捏捏的九曲十八弯的调用方式,让人毫无安全感,我要我自己指定this的指向,我要胜天半子!没问题,我的代码我做主:

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
var testCopy = obj.test
testCopy.call(obj)

可以看到,我们通过call(apply跟call的区别只是传参,作用是一样的,bind有点区别,bind能让我们的函数延迟执行,apply与call调用就执行,所以bind这样的形式我们也称为函数柯里化,这些就不是我们这里要说的啦)来调用testCopy,并且传入了你想要this指向的上下文,那么this就会乖乖按照你的指示行事啦。看到这里,我们也可以想象第一、二种形式其实可以转化成call/apply的形式,有一篇比较棒的文章描述了这样的思考过程,大家也可以看看this 的值到底是什么?一次说清楚

认准第四种“new test()”形式

终于到了最后一种形式了,这种形式比较好认,因为有标志性的new:

var a = 1
function test (a) {
    this.a = a
}
var b = new test(2)
console.log(b.a)

new这个操作符其实是new了一个新对象出来,而被new的test我们称为构造函数,我们可以在这个构造函数里定义一下将要到来的新对象的一些属性。那么在构造函数里,我们怎样去描述这个还未出生的新对象呢?没错,就是用this。所以构造函数里的this指的就是将要被new出来的新对象。

One more thing

感谢大家看到这里,但还要说最后一种形式。等等,不是说好的只有四种形式吗!稍安勿躁,正常套路下确实只有上面四种,但是有个东西别忘了,就是大家最喜欢的箭头函数。

var a = 1
var test = () => {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
obj.test()

来,往上翻一下我们的第一个锦囊,“函数被调用时(即运行时)才会确定该函数内this的指向。”现在函数这两个字要加个词修饰一下,变成普通函数(非箭头函数)才能区别于箭头函数。箭头函数中的this在函数定义的时候就已经确定,它this指向的是它的外层作用域this的指向。

最后

我们最后还要说:“到此为止,真的没有了。”
希望看完这篇文章之后,再有人问this指向的问题,你可以嘴角微微上扬,冷笑一声:“不要再问我this的指向问题了。”
扬长而去。

 

 

(本文为转载文章,原出处:https://segmentfault.com/a/1190000015438195  觉得作者写的很好就搬运过来了,有兴趣的可以关注下原作者,他的另外几篇文章也写的不错)

告别代码移植烦恼:STM32CubeMX 6.4.0 + STM32F407ZGT6 + YT8512C PHY芯片的LWIP网络配置全攻略 本文详细介绍了如何使用STM32CubeMX 6.4.0配置STM32F407ZGT6与YT8512C PHY芯片的LWIP网络适配,包括硬件特性解析、STM32CubeMX基础配置、专用驱动适配和LWIP协议栈定制化配置,帮助开发者解决PHY芯片差异导致的网络问题。 阅读详情

相关推荐

SAP FI 提示没有为会计年度0 定义版本2025 GP626

SAP 错误 GP626 是一个常见的系统消息,通常表示某个会计年度的版本(如版本 0)未被定义或未激活。:在执行某些事务(如创建采购订单、过账凭证或维护成本中心)时,系统会检查相关版本是否已定义。的“Settings for Each Fiscal Year”界面中,选择一个已激活的会计年度。的“Settings for Each Fiscal Year”界面中,找到未激活的会计年度。:在控制范围(Controlling Area)中,未为指定的会计年度定义版本 0。如果没有,添加或复制现有年度的设置。

GAVIN 2489

JS中THIS的五种情况

一、事件绑定 THIS1: 给元素的某个事件行为绑定方法,事件触发,方法执行,此时方法中的this一般都是当前元素本身 在代码中,有一个button <button id="btn">点我一下~</button> <script> //DOM0事件绑定 // btn.onclick = function anonymous...

zoepriselife316的博客 818

C#上位机与MES系统数据对接:从协议选型到安全传输的实战解析

本文详细解析了C#上位机与MES系统数据对接的全过程,从协议选型到安全传输的实战技巧。针对工业互联网场景下的数据对接挑战,提供了RESTful API、MQTT和OPC UA等协议的选型建议,并分享了健壮性设计、异常处理和安全传输的实用代码示例,帮助开发者高效实现数据上传与系统集成。

weixin_30566063的博客 105

this指向问题汇总

普通函数: 1、this总是代表着他的直接调用者,例如obj.fun(),那么fun()中的this就是obj; 2、调用的时候,没有任何前缀,则指向window,new的时候,指向new出来的对象; 3、在默认情况下(非严格模式),没找到直接调动者,则this指向window; 4、在严格模式下,没有直接调用者的函数中的this是undefined; 5、使用call、apply、bind绑定的......

Jermyo的博客 4298

Windows服务器SSL漏洞修复实战:如何一键禁用TLS 1.0/1.1避免SWEET32攻击

本文提供了Windows服务器修复SWEET32漏洞的实战指南。通过组策略编辑器,详细讲解如何一键禁用不安全的TLS 1.0/1.1协议,并优化密码套件顺序,以消除由3DES等弱加密算法带来的安全风险。文章还涵盖了应对SQL Server等应用兼容性挑战的解决方案,以及企业级批量部署的脚本化方法,帮助管理员系统性地提升服务器TLS/SSL安全配置。

weixin_29310631的博客 245

Solidworks在Windows 11上安装失败?这里有解决方案

通过上述步骤,你应该能够解决在Windows 11上安装Solidworks时遇到的问题。这个方法通过调整注册表的设置,提高了安装程序的权限,从而有效避免了安装过程中的权限障碍。当然,每个系统的具体情况可能有所不同,如果在尝试上述方法后仍然无法解决问题,建议联系Solidworks的技术支持团队,获取更专业的帮助。希望本文能够对你有所帮助,祝你工作顺利,设计无忧!

nntxthml的博客 4912

不要再问我this的指向问题了

this的指向已经是一个老生常谈的问题,每逢面试都要去复习复习,近来巩固js的基础,决心彻底掌握这个知识点,一劳永逸。说明一下,为了不影响大家的思考过程,下面的代码都不会去注释答案,想知道答案,只需要去控制台执行一下。 四类场景逐一击破 首先,分析this的指向共有四种类型,在分析之前,我们首先带好两个锦囊:1.函数被调用时(即运行时)才...

weixin_33915554的博客 307

AT91SAM9260搭建LINUX操作系统

一、 编写目的 2 二、 系统搭建 2 1. 下载相关软件包 2 2. Bootstrap编译 3 3. U-BOOT编译 5 4. LINUX编译 7 5. 通过U-BOOT的TFTP命令从TFTP服务器下载系统镜像 9 6. 文件系统制作 10 7. 挂载NFS作为根文件系统 10 三、 总结 14 一、编写目的 本文档用于记录AT91SAM9260 LINUX学

lshiceman的专栏 7412

href="javascript:_do(this);"和onclick="_do(this)"的区别

内容 function _do(o){ alert(o.innerHTML); } 这里点击a标签会弹出undefined的提示框 内容 这里点击a标签会弹出内容的提示框

疯雪的博客 732

Allegro快速编辑丝印文字操作指导

选择setup-Application Mode-placement edit。Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下。这个功能还支持拷贝粘贴,可以从其它地方拷贝过来,免去了书写的麻烦。出现text edit窗口,输入自己需要的文字,点击ok。鼠标移动到丝印文字位置,文字会被高亮起来。Allegro快速编辑丝印文字操作指导。点击丝印文字,丝印会被高亮起来。选择Text edit 命令。输入需要更改后的文字,如下。右击选择text edit。以编辑下方丝印文字为例。

weixin_54787054的博客 4192

【Clickhouse】Cannot allocate block number in Zookeeper write prefix view location

我有一个问题,我CK集群跑批的时候,replicated表变成只读的了下面是CK的报错和当时ZK的日志。下面是zk报错开始 我认为是写入的时候,压力太大,ZK扛不住了,就按照博客里的建议优化了ZK的参数,现在偶尔还会只读,zk报错都是图里的那种clickhouse的集群是5分片的集群,数据量比较大。每小时批量一次,每次2-10W条数据,字段的话,不到200个字段,使用的 jdbc sink写入。

九师兄 836

彻底理解this指向

深度了解this指向

m0_73302873的博客 2609

#systemverilog# 之 event region 和 timeslot 仿真调度(三)Verdi 辅助查看

通过今天的学习,我们知道:event region 是event sequence 的全集。我们打开了 event region feature 也就开启了event sequence 的功能。

那么菜的博客 1365

js中的this指向问题以及改变this指向

JS中的this 指向问题 代码解释: <!-- <button>点击</button> --> <script> var Btn = document.getElementsByTagName("button")[0]; Btn.onclick = function(){ console.log(this); //button fun () } function fun(){

weixin_51723279的博客 266

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

js中this指向问题

在js中,this关键字的指向是一个比较重要的概念,它的值取决于函数的调用方式。

weixin_46541579的博客 1330

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

js this 阮一峰_JavaScript关于this指向的问题

前短时间在js this指向问题上有些迷茫,这段时间通过查阅一些资料以及看了阮一峰老师对this指向问题的解析,自己也深受体会,下面就谈一谈通过学习后自己对this指向的深入理解。一丶关于this不同方式 调用的不同的表现方式var obj = { a: 1, f1: function () { console.log(this.a) } }; var f1 = obj....

weixin_42525582的博客 1054

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaScript中this的指向问题

JavaScript中this的指向问题

cql_fan的博客 1060

JS(javascript)中this的指向问题

众所周知,this的指向问题一直是JS中比较难的问题,很多时候我们都搞不清this到底指向的谁。今天,我就来给大家讲一下this的指向问题。 一句话概括:谁调用this,this就指向谁。 接下来给大家举几个简单的例子: var lilei = { name : "lilei", age : 18, say : function() { ...

weixin_44316351的博客 229

JS中this指向问题

首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题。  为什么要学习this?如果你学过面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章,当然如

qq_42489251的博客 1970

关于JS中this对象指向问题总结

关于JS中this对象指向问题,相信做过项目的小伙伴多多少少都会遇到过,明明感觉代码写的没问题,可是运行的时候,就会报错,比如报错 xxx is not a function。我最近也遇到了,百度学习了不少前辈对于this对象指向问题的解析,于是总结了这篇文章。

铁锤妹妹的博客 4683

JavaScript:this指向问题

this指向问题快速理解函数this指向问题_哔哩哔哩_bilibili。

m0_74141224的博客 689

JavaScript中this指向问题

箭头函数本身没有this,箭头函数中的this与上级作用域中的this相同。函数还可以作为某个对象的方法调用,这时this就指向这个调用函数的对象。bind方法会将函数的this,永久捆绑在指定的对象上,不能改变。在let中声明的箭头函数,存储在脚本作用域中,

m0_72752380的博客 1929

JS中this的指向问题

各种情况下的this指向向问题全局环境下函数上下文调用普通函数的调用对象中函数的this指向总结改变this指向的三个方法箭头函数中的this指向问题定时器setTimeout&setInterval中函数的this指向问题补充 全局环境下 全局环境下,this始终指向全局对象(window), 无论是否严格模式; console.log(this); //window this.a = ...

weixin_41500253的博客 436

关于js中this的指向问题

https://www.cnblogs.com/pssp/p/5216085.html

qq_41398471的博客 164

JavaScript(this指向问题、JS执行机制、location,history对象)

JSday12 文章目录JSday12this指向问题JS执行队列JS是单线程同步和异步同步异步JS执行机制(事件循环even loop)location对象location对象属性:location对象的方法history对象 this指向问题 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的对象。 全局作用域或者普通函数中this指向全局对象window(注意定时器里面的thi指向window) 方法调用中谁调用th

weixin_45886797的博客 423

Javascript中this指向问题

普通函数时,this指向window <script> function test() { console.log('=== test this: ', this) } test() const test1 = function () { console.log('===test1 this: ', this) } test1() &

Celester_best的博客 2047
上一篇: 用HTML+CSS做一个小黄人
DOLEAM
博客等级 码龄11年 9粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值