如何讲清楚this指向?_想弄清楚this指向谁怎么办,10天拿到腾讯网络安全岗offer

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

接下来看一段代码

var obj = {
    show : function(){
        console.log(this);
    }
}
obj.show();

结果很容易预测,打印obj对象本身

在JS中,this属于一个关键字,也就是可以理解为,它是一个系统自带命令

通常,我们把它的含义解释为:当前对象

那么问题来了: 当前对象到底是指谁呢?

在上面的代码案例中,this代表的就是obj这个对象

接下来我们再看一段代码

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

结果打印window对象

如果你对这个打印结果感到奇怪,那么可能你忽略了一个常识问题

window对象是可以省略不写的!

所以,上面的代码,实际上等价于:

function show(){
    console.log(this);
}
window.show();

我再举一个常见的例子,关于事件绑定

btn.onclick = function(){
    console.log(this);
}
btn.onclick();   //手动调用函数

//除手动调用外,鼠标单击按钮也可以触发函数执行

最终,无论是手动调用,还是单击按钮调用

打印结果都是btn对象


我们似乎总结出了一个this指向的规律

this总是指向,调用该函数的对象

如果你的代码结构是这样的

对象.函数();
那么,函数里的this,必然指向这个对象本身!

假设这个结论是成立的, 我们不妨来验证一下我们的猜想!!

function show(){
    console.log(this);
}
window.show();  //打印window对象

var obj1 = {};
obj1.show1 = show;
obj1.show1();  //打印obj1对象

var obj2 = {};
obj2.show2 = obj1.show1;
obj2.show2();  //打印obj2对象

从上面代码的例子中,可以看出来

**window对象和obj1对象和obj2**对象,共享了一个函数 show

window.show == obj1.show1;  //true
window.show == obj2.show2;  //true

三个对象,用了同一个函数

但打印出的this是各不相同的

window.show(); 打印出window对象

obj1.show1(); 打印出obj1对象

obj2.show2(); 打印出obj2对象

这似乎再一次印证了,我们刚才的猜想:

函数由哪个对象调用,this就指向哪个对象


科学是严谨的,得出结论之前,我们还是要反复验证

再看一个例子:

btn.onclick = function(){
    setTimeout(function(){
        console.log(this);
    },0)
}
btn.onclick();

实际上,我只是在原来代码的基础上,增加了一个延迟器,并且时间设为0

那么打印出的this会不会有变化呢??

你可以先思考一番

通常按照直觉,我们会认为,延迟器只是延缓了执行时间,打印结果依然还是btn对象,没有变化

但经过测试发现,实际的打印结果,是 window对象

是我们刚才的猜想错了吗?

要解释这个现象,我们得重新来观察这段代码

btn.onclick = function(){  //<----这个函数,用A来表示
    setTimeout(function(){ //<----这个函数,用B来表示
        console.log(this);
    },0)
}
btn.onclick();

注意代码当中出现了两个函数,我们分别起名字叫做函数A函数B

按照我们刚才的猜想: 函数由哪个对象调用,this就指向哪个对象

所以,this指向会依赖它所在的函数

而这个函数,到底是 函数**A还是函数B**呢?

其实你不难从代码中看的出来, this很明显是在函数**B**中的

所以, 结果没有打印出 btn, 现在我们也不感到奇怪了

因为, this已经不再函数 **A的内部了,而是函数B**的内部

你可能还要问,为什么函数**B**里的 this指向window呢?

这里其实算是一个特例,传入定时器的函数,由哪个对象调用,我们不得而知

这种情况,this就指向window

你暂时记住这个规律就好了,等你学完了作用域链,你就会明白其中的本质


回到我们开头的新闻

假设日记就是嫌疑人写的。 但日记里全是第三人称。那么 『 他 』到底是谁就很难说了

反过来如果日记里用的都是第一人称写的。 那么 『 我 』肯定指的是嫌疑人自己

JS函数当中的this关键字, 就相当于我们说话中的第一人称代词我

例如这样一个例子:

A对B说:“我要杀了你!”

这里的『我』指代A, 『你』指代B

B对A说:”我要弄死你!”

这里的『我』指代B, 『你』指代A

所以你看,同样的一个字,它可以指代任何人,关键看从谁的嘴里说出来

function fn(){
    //this, 就相当于中文里的我
    //不要上来就问this会指向谁
    //我们必须搞清楚上下文环境,fn是谁调用的?(相当于这句话从谁的嘴里说出来)
    //如果我们不能弄清楚这个问题,讨论this指向就没有意义
    console.log(this);
}

到目前为止,我们差不多可以得出结论了

下面用几个练习最终验证一下

var obj = {
    show: function(){
        console.log(this);
    }
}

上面的代码,最终打印obj对象
无论经过多少曲折,我们最终只看一个结论,那就是:

this所在的函数,由哪个对象调用?

我把代码进一步改造

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

var obj = {
    show: fn
}

btn.onclick = function(){
    window.setTimeout(function(){
        obj.show();
    }, 100);
}

上面的代码,最终打印还是obj对象


当然了,也总会有一些例外情况, 比如下面这个:

function m1(){
    function m2(){
        console.log(this);
    }
    m2();
}
m1();

我们不禁要问,函数m2是由哪个对象调用的?

我们想尽了各种可能,最终发现都是错的。

我们始终不知道这个m2由哪个对象调用,好像它就那样执行了

而实际的打印结果呢?

不出意外,还是window对象

最后的结论

1. 所有的this关键字,在函数运行时,才能确定它的指向

2. this所在的函数由哪个对象调用,this就会指向谁

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-S5VzKTEI-1713586465453)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值