【JavaScript】this指向经典面试题(超详细)

【JavaScript】this指向经典面试题(超详细)还会担心被面试到有关 this 指向的问题嘛 那还等什么 进来带你学习你看不懂的 this 指向面试题

在这里插入图片描述

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦!

赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。
面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏 。
在这里插入图片描述






?前言

本篇文章主要写的是【JS中this指向面试题(超详细代码解读)】,面试遇到的经典问题不少,所以本文总结一写常见的分享给各位。
只要我们掌握了this的四个绑定规则,仔细的去慢慢分析一定没有问题。接下来为大家展示四个经典的面试题。

面试题参考文章:

  • 【Web前端面试】葵花宝典(2022版本)—— Vue篇
  • 【Web前端面试】葵花宝典(2022版本) —— React 篇
  • 【Web前端面试】葵花宝典(2022版本)—— CSS篇
  • 【Web前端面试】葵花宝典 (2022版本)—— JS篇(上)
  • 【Web前端面试】葵花宝典(2022版本)—— JS篇(下)
  • JavaScript】中this指向相关的经典面试题
  • 【JavaScript】作用域提升面试题(详解)

【面试专栏】—— 点击链接即可订阅面试专栏

由于先写代码然后再在代码块下面进行分析解释,怕xdm找不到对应的句子,所以直接就在代码块中,相应的句子后面给出了分析解释。下面的四个案例皆是如此,望见谅。

面试题一:

这道面试题非常简单,无非就是绕一下,希望把面试者绕晕:

var name = 'window' // var name = 'window' 表示在window中name的值为 ’window‘ var person = { 
    name: 'person', sayName: function () { 
    console.log(this.name) } } function sayName () { 
    var sss = person.sayName; sss();// window 独立调用指向全局对象window person.sayName(); // person 隐式调用 (person.sayName)(); // person 和上一句效果一样(person.sayName) 带小括号不带小括号没区别 (b = person.sayName)() // window 间接引用 ,(b = person.sayName)的结果是一个值,并没有和person对象有联系,所以后面加一个()进行调用的时候,还是属于默认绑定(直接调用),this指向全局对象 } sayName() 

面试题二:

这道面试题比上一道更加绕一些,在对象内部进行了函数的声明:

var name = 'window' var person1 = { 
    name: 'person1', foo1: function () { 
    console.log(this.name) }, foo2: () => { 
    console.log(this.name) }, foo3: function () { 
    return function () { 
    console.log(this.name) } }, foo4: function () { 
    return () => { 
    console.log(this.name) } } } var person2 = { 
    name: 'person2' } // 正题来咯 person1.foo1(); // person1 (隐式绑定) person1.foo1.call(person2); // person2 (call显示绑定person2,显示绑定优先级大于隐式绑定) person1.foo2(); // window (箭头函数不绑定作用域,找到上层作用域为全局window) person1.foo2.call(person2);// window (箭头函数没有this,call()无效) person1.foo3()(); // window (person1.foo3()得到一个return的函数,再加上一个小括号属于独立调用指向全局对象window) person1.foo3.call(person2)(); // window (person1.foo3.call(person2)这句话得到返回值后,后面加小括号调用,还是属于独立调用 指向window)  person1.foo3().call(person2);// person2 (最终调用return函数时,显示绑定上了person2) person1.foo4()();// person1 (person1.foo4()这句话得到return后的函数为箭头函数进行调用,箭头函数中没有this向上一层作用域找,上层作用域为foo4,this指向person1) person1.foo4.call(person2)();// person2 (上层作用域被显示绑定为person2 ,在箭头函数中找不到this后,向上层所用域找 就找到了之前被显示绑定的person2) person1.foo4().call(person2);// person1 (person1.foo4()这句话得到return后的函数为箭头函数进行显示绑定person2,但箭头函数中没有this,显示绑定无效,向上一层作用域找,找到函数foo4,this指向person1) 

面试题三:

第三题就更加绕了,学过构造函数的小伙伴应该不难看懂,没学过的也可以去学习一下:

var name = 'window' function Person (name) { 
    this.name = name this.foo1 = function () { 
    console.log(this.name) } this.foo2 = () => console.log(this.name) this.foo3 = function () { 
    return function () { 
    console.log(this.name) } } this.foo4 = function () { 
    return () => { 
    console.log(this.name) } } } var person1 = new Person('person1') var person2 = new Person('person2') person1.foo1() // person1 (隐式绑定) person1.foo1.call(person2) // person2 (显示绑定person2,显示绑定优先级高于person1.foo1的隐式绑定) person1.foo2() // person1 (上层作用域中的this是person1函数) person1.foo2.call(person2) // person1 (显示绑定在箭头函数中无效,所以结果还是上层作用域中的this是person1函数) person1.foo3()() // window (person1.foo3()得到返回函数 加小括号进行直接调用 this指向全局作用域window) person1.foo3.call(person2)() // window (person1.foo3.call(person2)得到返回函数后,独立函数调用指向全局) person1.foo3().call(person2) // person2 (person1.foo3()得到返回函数后,显示绑定person2) person1.foo4()() // person1 (箭头函数中没有this,向上一层作用域找 this指向person1) person1.foo4.call(person2)() // person2 (person1.foo4.call(person2)显示绑定person2,得到返回的箭头函数后,向上一层作用域找,this指向person2) person1.foo4().call(person2) // person1 (person1.foo4()得到返回箭头函数显示绑定person2无效,向上一层作用域找,this指向person1) 

面试题四:

var name = 'window' function Person (name) { 
    this.name = name this.obj = { 
    name: 'obj', // 此时foo1,foo2的上层作用域为obj对象 foo1: function () { 
    return function () { 
    console.log(this.name) } }, foo2: function () { 
    return () => { 
    console.log(this.name) } } } } var person1 = new Person('person1') var person2 = new Person('person2') person1.obj.foo1()() // window (person1.obj.foo1()得到返回函数后直接调用,this指向全局对象) person1.obj.foo1.call(person2)() // window (还是直接调用,this指向全局对象) person1.obj.foo1().call(person2) // person2 (person1.obj.foo1()这句话得到返回函数后,使用显示调用绑定person2,this指向person2) person1.obj.foo2()() // obj (person1.obj.foo2()这句话得到返回函数后调用,但是箭头函数没有this,向上一层作用域找,上一层作用域为foo2函数,foo2是被obj对象调用的,所以this指向obj对象) person1.obj.foo2.call(person2)() // person2 (person1.obj.foo2.call(person2)将foo2的上层作用域指向了person2,再进行调用的时候,上一层作用域就是person2) person1.obj.foo2().call(person2) // obj (person1.obj.foo2()的到返回函数,使用显示绑定call无效,上一层作用域为foo2函数,foo2是被obj对象调用的,所以this指向obj对象) 

这里可能产生一点有疑问的地方,首先说明在对象中是没有作用域的,person1.obj.foo2()() 这句,按照之前的理解,person1.obj.foo2()这句话得到返回函数后调用,但是箭头函数没有this,向上一层作用域找,因为obj对象是没有作用域的,按道理来讲this应该指向person1,但是foo2函数是被obj对象隐式绑定进行调用的,所以会指向obj对象。


不了解this的四种绑定规则或者this的指向问题的小伙伴,可以参考【JavaScript】this关键字的指向问题(五千字详解)和JavaScript中this四种绑定规则优先级比较与箭头函数中的this获取,有详细进行描述与举例说明。

?专栏分享:

JavaScript相关面试题就更新到这里啦,相关 Web前端面试题 可以订阅专栏哦?
专栏地址:《面试必看》


名言警句:说能做的做说过的 \textcolor{red} {名言警句:说能做的做说过的} 名言警句:说能做的做说过的

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

? 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217179.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午10:10
下一篇 2026年3月18日 上午10:10


相关推荐

  • verilog ifdef_verilog define

    verilog ifdef_verilog define注意:feof判断文件结束是通过读取函数fread/fscanf等返回错误来识别的,故而判断文件是否结束应该是在读取函数之后进行判断。比如,在while循环读取一个文件时,如果是在读取函数之前进行判断,则如果文件最后一行是空白行,可能会造成内存错误。https://blog.csdn.net/Chauncey_wu/article/details/902897491.打开文件  int…

    2025年6月1日
    5
  • 画完三角形再画谢尔宾斯基地毯

    画完三角形再画谢尔宾斯基地毯照样废话不说,看代码看注释importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Toolkit;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;import…

    2022年7月13日
    18
  • A股30年历史的拐点和暗示(大盘篇)

    A股30年历史的拐点和暗示(大盘篇)转A股30年,历史的拐点和暗示(大盘篇)来源:主动型量化   作者:刘帅路————————————————————————————–拓展阅读:1.集合竞价选股2.七种量化选股模型…

    2022年6月23日
    52
  • office word 公式编号

    office word 公式编号方式 1 推荐 word2016 在公式的最后键入 和标号 然后回车就有了标号方式 2 画表格 1 插入三栏表格 2 将公式放入中列表格中居中对齐 将编号放入右列表格中靠右对齐 3 将表格边距设为 0 最后隐去表格外框方式 3 制表符 作者 知乎用户链接 https www zhihu com question answer 效果 公式在行的最中间 序号在行的最右边 且序号在垂直位置也与公式对齐 公式的插入就不说了 直接插入 gt 公式 然后输

    2026年3月16日
    2
  • ASP.NET_正则表达式_匹配HTML中的一行或多行

    ASP.NET_正则表达式_匹配HTML中的一行或多行

    2021年11月16日
    49
  • LangChain+DeepSeek+RAG本地部署教程

    LangChain+DeepSeek+RAG本地部署教程

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号