当前位置: 首页 > news >正文

面试题--this关键字

this 指向是前端面试中的常问题型,简单分析为以下几种:

1. 在全局作用域中,this 关键字固定指向全局对象 window 或者 global。

2. 在函数作用域中,取决于函数是如何被调用的。

        1)函数直接调用,this 指向全局对象。

        2)通过一个对象的属性调用,格式为对象.属性()对象["属性"](),this指向该对象。

3. 使用构造函数创建对象时,构造函数中的 this 代表着 new 的对象。

4. 使用 call、apply、bind 绑定时,this 指向绑定的对象。

5. 箭头函数中 this 等于其定义环境中的 this,并且箭头函数一经创建,this 不能被任何方法改变。

对于 this 指向问题,不能仅仅了解理论知识,还需要实际应用,下面是一些常见的面试题。

面试题一:

console.log(this); 
function demo() {console.log(this);
}
demo(); let a = demo;
let array = [a, demo];
array[0]();
array[1](); let obj = {a,demo
};
obj.a();
obj.demo(); // 答案
// window 
// window
// 数组里,值调用,此时 this 指向数组,返回值是数组[],下面对象同理
// [ƒ, ƒ]
// [ƒ, ƒ]
// {a: ƒ, demo: ƒ}
// {a: ƒ, demo: ƒ}

结论一:this 在调用时才会知道指代的对象是谁,也就是说:谁调用函数,this 就指向谁,没有调用时候,this 指向未知。

面试题二:

const obj1 = {a: function () {console.log(this);},b: {x: 123,func: function () {console.log(this);}}
}
obj1.a();
obj1.b.func();
const temp = obj1.a;
temp();// 答案
// {b: {…}, a: ƒ} 
// {x: 123, func: ƒ}
// window

结论二:如果将函数重新赋值一个新的变量,执行时指向 window,此时是函数直接被调用。

面试题三:

const obj = {firstName: 'sun',lastName: 'flower',age: 1,sayHello: function() {console.log(`My name is ${this.firstName}${this.lastName},and I am ${this.age} years old`);}
}
obj.sayHello(); const a = obj.sayHello;
a();// 答案
// My name is sunflower,and I am 1 years old
// My name is undefinedundefined,and I am undefined years old
// 此时 a 里面只保存函数,而没有函数内部的值,因此均为 undefined。
let obj = {firstName: 'sun',lastName: 'flower',age: 1,sayHello: function() {console.log(`My name is ${obj.firstName}${obj.lastName},and I am ${obj.age} years old`);}
}
let b = obj;
obj = 123;
b.sayHello(); // 答案
// My name is undefinedundefined,and I am undefined years old

结论三:在对象内使用 this 最常见,this 指向当前被调用的对象,会实时改变,可以避免赋值导致的问题。

面试题四:

var obj = {fun1: function() {console.log(this);return function() {return this;};}
}
console.log(obj.fun1()());// 答案
// obj对象本身:{fun1: ƒ}
// window

首先 obj.fun1() 调用后,返回 function(){ return this } 函数,该函数再次调用时与 obj 没有关系,所以返回 window。注意是二次调用,有两次输出,结果不同。

以上就是常见关于 this 指向的问题,有需要的小伙伴可以仔细研究一下,对面试很有帮助哦。

相关文章:

  • 网络编程(三)
  • JVM类加载过程
  • linux进程加载和启动过程分析
  • 解决git status提示error bad signature 0x00000000
  • 步进电机和伺服电机哪个好_步进电机和伺服电机的区别
  • 一文了解知识中台:是什么、作用、如何搭建
  • 探索UWB模块的多功能应用——UWB技术赋能智慧生活
  • C语言习题~day27
  • LINUX系统编程:信号量
  • 最新扣子(Coze)使用指南更新:如何导入扣子插件,完全免费Coze教程
  • JavaScript函数进阶学习
  • 0基础认识C语言(理论知识)
  • 算法课程笔记——计数原理
  • 直流电机工作原理与控制电路解析
  • 汇编原理(三)编程
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2017-08-04 前端日报
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CSS实用技巧
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • extract-text-webpack-plugin用法
  • HTML中设置input等文本框为不可操作
  • iOS | NSProxy
  • Java IO学习笔记一
  • laravel5.5 视图共享数据
  • Lsb图片隐写
  • MySQL的数据类型
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • 基于遗传算法的优化问题求解
  • 开源地图数据可视化库——mapnik
  • 如何合理的规划jvm性能调优
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 7行Python代码的人脸识别
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​linux启动进程的方式
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (3)llvm ir转换过程
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (33)STM32——485实验笔记
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)php投票系统 毕业设计 121500
  • (转)ORM
  • .java 9 找不到符号_java找不到符号
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET大文件上传知识整理
  • .net反编译的九款神器
  • .NET精简框架的“无法找到资源程序集”异常释疑