【超高频面试题】这两段代码的返回结果你知道是什么吗?

简介: 这两段代码的返回结果你知道是什么吗

引言


今天我经历了一场电话面试和一场线上笔试,这两者不是同一家公司,但却都考到了同一道题,那就是普通函数和箭头函数的区别 ,并且它们都给了我同样的一道题让我回答,这里我先把题目放在这,你们可以先自己尝试写一写,看看是否正确,答案会在文章末尾公布


window.name = '我是外部'
let obj = {
    'name': '我是内部',
    fn: function() {
        console.log(this.name);
    }
}
obj.fn()
let fn = obj.fn
fn()
// 问:本段代码会返回什么结果


window.name = '我是外部'
let obj = {
    'name': '我是内部',
    fn: () => {
        console.log(this.name);
    }
}
obj.fn()
let fn = obj.fn
fn()
// 问:本段代码会返回什么结果


因为作者之前写过一篇关于这两者的区别,因此本文就不再做过多的阐述,这里放上文章链接,建议大家花5分钟好好看看:千万别再一直无脑使用ES6的箭头函数了,它虽然很有用但并不是万能的


知识点


这里直接总结一下普通函数和箭头函数的区别:


  • 普通函数中的this指向是运行时绑定的 ; 箭头函数中的this指向是定义时绑定的


  • 普通函数有属于自己的this ; 箭头函数没有属于自己的this , 因此箭头函数中的this会自动向上找一个最近的this进行绑定


  • 普通函数内有 arguments 对象 ; 箭头函数内没有 arguments 对象


分析


接下来我们分别来分析一下文章开头的两段代码


第一段代码


考察普通函数的使用


window.name = '我是外部'
let obj = {
    'name': '我是内部',
    fn: function() {
        console.log(this.name);
    }
}
obj.fn()
let fn = obj.fn
fn()


关键: 普通函数内的 this 是运行时绑定的,所以 this 指向与函数的所处环境有关


首先在外部直接调用了 obj.fn() ,此时的函数是处于对象 obj 内的,因此 this 指向的就是该函数所处的环境,即 obj 。所以返回的是 我是内部


然后又将 obj 内部的 fn 函数赋值给了全局的变量 fn ,随即对其进行了调用,此时的函数处于全局环境中,因此 this 指向的就是全局环境,在浏览器中为 window 。所以返回的是 我是外部


第二段代码


考察箭头函数的使用


window.name = '我是外部'
let obj = {
    'name': '我是内部',
    fn: () => {
        console.log(this.name);
    }
}
obj.fn()
let fn = obj.fn
fn()


关键: 箭头函数中的 this 是定义时绑定的,并且其没有自己的 this,所以它会向上寻找一个最近的 this 进行绑定


因为箭头函数中的 this 在定义时就绑定了,因此本段代码的两种调用方式效果是一样的


先来看 obj 中的 fn 箭头函数 ,其调用了 this ,但因其没有属于自己的 this ,所以就向上寻找,我们都知道,在JS中,普通函数和对象都有属于自己的 this ,因此 fn 中的 this 就和离它最近的 obj 中的 this 绑定了


显而易见,objthis 指向的是全局,在浏览器中是 window,因此答案就呼之欲出了,本段代码两次调用函数打印的结果都是 我是外部


总结


第一段代码的打印结果:


我是内部
我是外部


第二段代码的打印结果:


我是外部
我是外部


你答对了吗?

相关文章
|
7月前
|
前端开发
【面试题】如何使用ES6 ... 让代码优雅一点?
【面试题】如何使用ES6 ... 让代码优雅一点?
|
7月前
|
存储 前端开发 JavaScript
【面试题】你是如何让js 代码变得简洁的?
【面试题】你是如何让js 代码变得简洁的?
|
4月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
4月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
4月前
|
JavaScript 前端开发 程序员
JS小白请看!一招让你的面试成功率大大提高——规范代码
JS小白请看!一招让你的面试成功率大大提高——规范代码
|
7月前
|
缓存 监控 算法
Python性能优化面试:代码级、架构级与系统级优化
【4月更文挑战第19天】本文探讨了Python性能优化面试的重点,包括代码级、架构级和系统级优化。代码级优化涉及时间复杂度、空间复杂度分析,使用内置数据结构和性能分析工具。易错点包括过度优化和滥用全局变量。架构级优化关注异步编程、缓存策略和分布式系统,强调合理利用异步和缓存。系统级优化则涵盖操作系统原理、Python虚拟机优化和服务器调优,需注意监控系统资源和使用编译器加速。面试者应全面理解这些层面,以提高程序性能和面试竞争力。
86 1
Python性能优化面试:代码级、架构级与系统级优化
|
6月前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
7月前
|
数据采集 数据挖掘 Python
最全妙不可言。写出优雅的 Python 代码的七条重要技巧,2024年最新被面试官怼了还有戏吗
最全妙不可言。写出优雅的 Python 代码的七条重要技巧,2024年最新被面试官怼了还有戏吗
|
7月前
|
数据采集 XML 程序员
最新用Python做垃圾分类_python垃圾分类代码用key和format,5年经验Python程序员面试27天
最新用Python做垃圾分类_python垃圾分类代码用key和format,5年经验Python程序员面试27天
最新用Python做垃圾分类_python垃圾分类代码用key和format,5年经验Python程序员面试27天
|
7月前
|
数据采集 机器学习/深度学习 人工智能
最新用python代码画爱心,来自程序猿的浪漫~_python画爱心代码(1),2024年最新面试简历模板免费
最新用python代码画爱心,来自程序猿的浪漫~_python画爱心代码(1),2024年最新面试简历模板免费
最新用python代码画爱心,来自程序猿的浪漫~_python画爱心代码(1),2024年最新面试简历模板免费