面试大厂前端,作用域这道题该怎么答?

疫情渐渐过去,也不知道疫苗研发到哪一步了,程序员每天数以万计的投简历,找工作。没工作的希望赶紧找到一个,有工作的希望去一家更好点的。难逃的一步就是面试。

有的面试官上来就问你怎么理解作用域的?这个问题很简单啊,于是开始回答,还很自信。

1、作用域全局作用域和局部作用域,局部作用域会在当前作用域内查找,找不到的话会向外层查找,一直找到最外层的window层。

你以为答完了吗?大厂招人问的问题,你一句话就搞定了,想想都不符合场景啊。

2、嗯?深思一下。我觉得作用域区分全局作用域和局部作用域,局部作用域比如普通的function函数,变量会先在本函数内,也就是本作用域内查找,这里涉及到变量的提升,变量会比function定义的函数先提升。所以如果当前作用域位于前面的代码中有定义,那么直接找到;如果在当前函数的当前查找代码的下面有定义,我们会去提升的顶部找,结果就undefined了;但这并没有结束,undefined不是我想要的,我想要的是真实的值,我还像上层去查找,如果上层乃至window顶层找到了,那么很开心,我可以拿到我的值了;如果一直到window也找不到,只能认了,undefined也是代码也是肉,我只能接受了。

但是有闭包这种不同的局部作用域,他的变量很可能是被这个作用域后面的括号穿进去的,那么很可能你要找的那个变量值就是外部传进去的,比如那个总是变化的this传输,很可能又被其他某个地方调用的,所以你又得跟面试官解释作用域链。但不变得是,最终总得找到window这个顶层宿主。

这个时候你为了表示自己平时是个有心人,是不是该举例子说明自己工作中是如何注意这个知识点的呢,更直白的说,我利用这个知识点解决了XX问题,OK,面试官会喜欢你的。

比如:我的某个函数内用到了一个name值,但当前作用域没有定义这个变量,但我通过console.log发现name也是有值的,我通过查找,发现他是如何流转的。甚至项目大的时候,你拿到别人的代码,很多组件都直接use到Vue的全局上了,你肯定局部怎么找都找不到。

3、你以为你过关了吗?这个看面试官心情了,但我觉得没有过关,第一次回答太过于表面,培训班层次,第二次回答还不错,有些经验,但我们厂想找个再好点的。

嗯?我再想想啊,我已经说了挺多了啊。哦哦!!上面2点其实会发现一个问题,作用域的行动,其实是一个查找的过程,好比某个东西在哪个文件夹下,我们一直在通过一个目标变量去查找这个变量的值,又或者是这个变量最初是在哪里定义的,我们去查找他。

定义就是我们最初在哪里var了他,或者在哪里window点了他,又或者一个容器prototype等于了他。这里我们重点说这个var值定义。你var了,必然会写一个变量值,等号,值。var a = 25;这样。你光写还不会存到内存中,你得启动浏览器吧,然后执行到这里,js被存储到了内存中,然后等着后人使用的时候来通过作用域查找他。

那么var  = 25; 不写变量,会报错吗?报什么错?谁报的错?为什么语法要求必须等号前面得有个一个不是关键字的变量名呢?

首先你写个var,编译器知道你要开始定义变量了,你写了a这个变量,编译器会把你的a存起来,你写等号表示必然要赋值了,会有一个left right的存储小区域。我们知道js会先异步加载,然后编译器都过一遍,再开始执行你的onload。所以你不写变量名,根本就轮不着执行你的代码呢,编译器都看不过去了,开始抛出错误了。他告诉你等号附近出现了错误。原因就是作用域没有形成,编译器认为这个作用域是错误的,不能被执行的。

4、我觉得你说到这一步,面试官会觉得你还不错。一旦他对你刚开始就持有一种不错的感觉的时候,后面有些问题他就有可能会放松一些。但一旦你刚开始就让人感觉不够好的话,可能轮不着问一些深层次的问题,谈话就over了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经海路大白狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值