前端面试——this指向

news2024/12/23 13:28:27

最近看到了面试题目有关于this指向的问题,网上搜了一篇文章,看了之后受益匪浅,特地总结一下。

原文章链接:前端面试中的“this”,你真的了解吗? - 哔哩哔哩

什么是this?

this是一个特殊的关键字,其值由运行时根据函数的执行环境绑定。

也就是说,this指向当前执行环境,可以使用其动态访问运行到其所在代码时候的所有变量

this的约束规则

1.默认的this指向window

这里没什么好说的,你在全局环境下使用的this,就是window对象

2.独立的函数调用,指向window

我们来对比一下,什么是独立和非独立

// 非独立函数 需要初始化,不存在变量提升
var a = function() {
    console.log("xxxx")
}
// 独立函数 存在变量提升 this指向window
function a() {
    console.log("xxxx")
}

 

        function a() {
            console.log('xxxxx',this);
            return function b() {
                console.log('yyyyy',this);
                return function c() {
                    console.log('zzzzz',this);
                }
            }
        }
        a()()()

可以看到,独立函数调用不管多深都是指向window 

 

3.自执行函数调用,指向window

        // exp1
        (function () {
            console.log(this); // Window
        })()

        // exp2
        var a = 10
        function foo() {
            (function son(that) {
                console.log(this); // Window
                console.log(that); // {a: 20, foo: ƒ}
            })(this) // 自执行函数后面加个()表示立即执行 ()里面可以塞入参数
        }

        var obj = {
            a: 20,
            foo: foo,
        }
        obj.foo() 

 

4.闭包当中的this,指向window

        var a = 10

        var obj = {
            a: 20,
            foo: function () {
                var sum = this.count + 10
                console.log('xxxxx',this.count,sum);
                console.log(this.a); // 20
                return function () {
                    console.log(this.a); // 10
                    return sum
                }
            }
        }
        console.log('xxxxx',obj.foo()() );

 

5.函数作为方法调用时,this指向函数的直接父对象

var a = 10
function foo () {
  console.log(this.a);
}

var obj = {
  a: 20,
  foo: foo,
  obj2: {
    a: 30,
    foo: foo
  }
}

// exp1
foo() // 10

// exp2
obj.foo() // 20

// exp3 
obj.obj2.foo() // 30 

隐式绑定丢失

1.隐式绑定的函数被分配为没有 this 指向的变量

var a = 10
var obj = {
  a: 20,
  foo: function () {
    console.log(this.a);
  }
}
function bar (fn) {
  fn()
}

bar(obj.foo) // 10 

2.隐式绑定的函数作为参数传给函数,丢失了this点

var a = 10
var obj = {
  a: 20,
  foo: function () {
    console.log(this.a);
  }
}
function bar (fn) {
  fn()
}

bar(obj.foo) // 10 

原作者应该写错了??这两个代码一模一样,我没太看懂??? 

3.setTimeout和setInterval函数的隐式绑定丢失

// exp1
setTimeout(function() {
  console.log(this); // Window
}, 1000)

// exp2
var a = 10
var obj = {
  a: 20,
  foo: function () {
    console.log(this.a); // 10
  }
}

setTimeout(obj.foo, 1000)

值得注意的是,这两个函数是可以传递this上下文的,只要我们将setTimeout函数的第一个参数写成箭头函数即可。

也就相当于,在这里匿名function的行为和非独立函数调用不一样,但是可以使用匿名箭头函数来实现该效果。

显式绑定

 我们使用call ,apply,bind来显式绑定this的环境

        var obj = {
            ttt: 'my name',
        }
        function test(v1,v2) {
            this.v1 = v1
            this.v2 = v2
            
            console.log('xxxxx',this.ttt);
        }
        test('a','b')
        console.log('xxxxx',obj);
        test.call(obj,'a','b')
        console.log('xxxxx',obj);
        test.apply(obj,['c','d'])
        console.log('xxxxx',obj);
        test.bind(obj,'e','f')()
        console.log('xxxxx',obj);

 

关于硬装订和new绑定,暂时没研究,感兴趣的读者可以前往原链接看看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为鲲鹏技术认证是什么?为什么要通过认证?

华为鲲鹏技术认证是什么? 华为鲲鹏技术认证是华为推出的一项生态合作伙伴计划,旨在积极推动从芯片到硬件系统,再到软件、服务的整个国产产业链的共建、共享、共赢。该认证要求测试产品自主可控,满足各地政府信息技术国产化替代工…

【五】阿伟开始学Kafka

阿伟开始学Kafka 概述 人生若只如初见,阿伟心里回想起了第一次和Kafka见面的场景,记忆虽然已经有些模糊,但是感觉初次见面是美好的。积累了一些实战经验之后,阿伟感觉不能再是面对百度开发了,于是决心系统的学习一下Ka…

数据库MySQL之事务、索引

目录 1.概述 2.事务 3.索引 3.1索引结构 3.2操作语法 1.概述 场景:假如我们需要解散教学部,那么该部门下的所有员工都需要删除。如果教学部成功删除了,但员工出于某些原因(比如SQL语句写错了等)并没有删除,此时就会出现数据…

Node 网络详解

Node 网络详解 1、 OSI & TCP/IP模型设计1.1 OSI七层模型应用层:(Application Layer)表示层:(Presentation Layer)会话层:(Session Layer)传输层:&#x…

Mycat分片-水平拆分

目录 场景 准备 配置 测试 续接上篇:Mycat分片-垂直拆分-CSDN博客 场景 在业务系统中, 有一张表(日志表), 业务系统每天都会产生大量的日志数据 , 单台服务器的数据存 储及处理能力是有限的, 可以对数据库表进行拆分。 准备 准备三台服务器,具体的结…

2024年Google开发者大会:AI赋能的Web、移动和云开发

一、大会概览 1.1 开幕与主题演讲 在北京国家会议中心举办的2024年Google开发者大会,是一场汇聚了全球顶尖开发者和技术爱好者的盛会。大会的开幕由Google大中华区总裁陈俊廷先生的主题演讲引领,他不仅回顾了中国开发者在全球技术舞台上的卓越表现&…

华硕飞行堡垒键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号: 型号 ASUS FX53VD(华硕-飞行堡垒) 板号:GL553VD 故障情况描述: 键盘无法使用,键盘除开机键外…

小型无人机训练与运用技术研究

1. 基础理论与概念 小型无人机(Small Unmanned Aerial Vehicle, sUAV)作为近年来快速发展的技术领域,其基础理论与概念是理解其全貌的基石。小型无人机通常指质量轻、尺寸小、易于携带和操作的无人飞行器,广泛应用于航拍、环境监…

基于yolov5 红绿灯交通检测,可对道路红绿灯进行检测可根据界面信息直接上传图片,视频等

模型训练:使用特定的数据集来训练YOLOv5模型以准确识别红绿灯。Web界面:构建一个用户友好的Web界面,让用户能够轻松上传图片或视频进行检测。性能优化:针对实时应用进行性能优化,确保检测速度足够快。部署:…

【高级IO-1】探索五种 I/O 模型及其高级I/O技术:基于 fcntl() 的代码应用

文章目录 1. 五种IO模型2. 高级IO的重要概念2.1 同步通信 与 异步通信2.2 阻塞与非阻塞2.3 如何理解四者间的关系? 3. 其他高级IO3.1 非阻塞 I/O3.2 纪录锁(Record Lock)3.3 系统 V 流机制3.4 I/O 多路复用(I/O Multiplexing&…

自养号测评技术:如何挑选适合的IP环境方案

市面上的IP服务及常见问题 当前市场上常见的IP服务包括911、Luminati、Google Fi、TM流量卡、Socks专线等。这些服务在为用户提供网络代理或VPN服务时,常会遇到以下主要问题: 1. 高负载与重复率高:由于使用人数众多,导致网络拥堵…

投入式水位计的测量精度和稳定性如何保证

投入式水位计作为水位监测的重要工具,其测量精度和稳定性直接关系到数据的准确性和可靠性。在实际应用中,多种因素会影响投入式水位计的测量精度和稳定性,了解这些因素并采取相应的措施,是确保测量准确性的关键。 1、环境因素 温度…

Tomca安装和配置教程

目录 一.背景: 二.下载和安装Tomcat: 三.配置Tomcat环境变量 四.检查Tomcat安装成功 一.背景: Tocamt是Apache软件基金会(Apache Software Fouondation)的jakarta项目中的一个核心项目,由Apache、Sun以及其他一些公司及个人共同开发而成。Tocmat是一…

微服务⽹关

微服务网关(API Gateway)是微服务架构中的一个重要组成部分,它充当客户端与后端服务之间的单一入口。API网关负责处理所有的出入请求,提供集中式的安全、路由、负载均衡、监控等功能。 主要功能: 请求路由&#xff1a…

【JAVA】阿里巴巴 EasyExcel:高效的Excel处理解决方案

文章目录 EasyExcel1. EasyExcel 简介1.1 主要特点1.2 依赖配置 2. EasyExcel 核心功能2.1 写入 Excel 文件2.2 读取 Excel 文件 3. 业务开发示例3.1 用户数据导出3.2 用户数据导入 4. 进阶用法4.1 自定义转换器4.2 自定义格式 更多相关内容可查看 附官网地址:https…

Directory Opus 添加管理员获得所有权右键菜单

Directory Opus 添加管理员获得所有权右键菜单 在windows的资源管理器中添加管理员获得所有权的右键菜单很容易,通过注册表就可以了. 但是在Directory Opus需要另外的操作方式, 点击设置->文件类型: 选择运行DOpus函数,因为我的资源管理器已经有这个右键了,就选这个: …

营运管理系统应用架构设计

集中营运系统2020年1月《银行业集中营运规范(JR/T0173-2020号)》标准由全国金融标准化技术委员会审查通过,并由中国人民银行作为银发〔2020〕10号文件正式发布。集中运营的建设核心应该围绕多元化作业和运营能力共享两大方面服务。集中营运的系统建设方向如图10-01所示。 图…

ARP协议分析

目录 实验设备和环境 实验记录 1、ARP报文分析 (1)建立实验拓扑 (2)设置抓包接口 (3)启动设备,开始抓包 (4)协议分析 ARP代理 (1)建立实…

如何科学设定短信群发频率

在利用短信群发作为营销策略时,平衡好发送频率至关重要。过于频繁的短信可能招致客户反感甚至被屏蔽,而发送不足则可能导致品牌信息被遗忘。因此,精准把握短信群发频率,是提升客户体验与品牌记忆度的关键。以下是几个常见行业短信…

YOLOv5改进 | 模块融合 | C3融合可变形自注意力模块【模块缝合】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改…