JavaScript全解析——this指向

news2024/10/7 4:29:02

在这里插入图片描述
本系列内容为JS全解析,为千锋教育资深前端老师独家创作

致力于为大家讲解清晰JavaScript相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~

this指向(掌握)

this 是一个关键字,是一个使用在作用域内的关键字

作用域分为全局作用域和局部作用域(私有作用域或者函数作用域)

全局作用域

全局作用域中this指向window

局部作用域

函数内的 this, 和 函数如何定义没有关系, 和 函数在哪定义也没有关系,只看函数是如何被调用的(箭头函数除外)

可分为以下场景:

普通函数中调用

普通函数中的this和全局调用一样,this指向window

语法:函数名()

<script>
    // 全局使用 this 
    console.log(this) //window 
    console.log(window) //window 
    console.log(window === this) //true 
    //普通函数调用 
    function fn() { 
        console.log('我是全局 fn 函数') 
        console.log(this) //window 
    } 
    fn() 
</script>

对象(包含数组)中调用

该函数内的 this 指向 前面的内容,也就是那个对象或者数组

语法:

对象名.函数名()*

对象名

<script> 
    //对象函数调用 
    function fn() { 
        console.log(this) //{fun: ƒ} 
    } 
    var obj = { 
        fun: fn 
    } 
    obj.fun() 
    obj['fun']() 
</script>

定时器处理函数中调用

定时器中的this同样也是指向window

<script> 
    // 定时器处理函数 
    setTimeout(function() { 
        console.log(this); //window 
    }, 1000) 
</script>

事件处理程序中调用

事件处理程序中的this指向的是事件源

<!DOCTYPE html> 
<html lang="en"> 

<head> 
   <meta charset="UTF-8"> 
   <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">        <title>Document</title> 
   <style> 
       div { 
           width: 200px; 
           height: 200px; 
           background-color: red; 
        } 
    </style> 
</head> 

<body> 
   <div>hello world</div> 
   <script> 
       var res = document.querySelector('div') 
       
       res.onclick = function() { 
           console.log(this); //<div></div>
       } 
   </script> 
</body> 

</html>

自执行函数中调用

●自执行函数中的this也指向window

<script> 
    (function() { 
        console.log(this); //window 
    })() 
</script>

强行改变this指向

通过上面的学习大家知道,this在不同的情况指向是不同的,但是有时候需要指向一个制定的对象,这就需要改变this的指向

可以理解成不管之前指向哪里,现在我让你指向哪里你就要指向哪里

强行改变this指向的方式可以通过call、apply和bind来改变

call调用

作用:改变函数内部this的指向

语法:

函数名.call()

对象名.函数名.call(参数1,参数2,参数3…)

参数:

○第一个参数是this要指向的对象

○从第二个参数开始,依次给函数传递实参

特点: 会立即调用函数或者说立即执行

<script> 
    function fn(a, b) { 
        console.group('fn 函数内的 打印') 
        console.log('this : ', this) 
        console.log('a : ', a) 
        console.log('b : ', b) 
        console.groupEnd() 
    } 
    var obj = { 
        name: '我是 obj 对象' 
    } 
    var arr = [100, 200, 300, 400, 500] 
    // 用 call 调用 
    fn.call(obj, 100, 200) 
    fn.call(arr, 1000, 2000) 
    /* 
    this : {name: '我是 obj 对象'} 
    a : 100 
    b : 200 
    fn 函数内的 打印 
    this : (5) [100, 200, 300, 400, 500] 
    a : 1000 
    b : 2000 
    */ 
</script>

apply调用

作用: 改变函数内部this的指向

语法:

○函数名.apply()
○对象名.函数名.apply(参数1,[参数2,参数3…])

参数:

○第一个参数是this要指向的对象

○第二参数的一个数组,要传递的实参要放到数组里面,就是有一个实参也要放到数组里面

特点: 会立即调用函数或者说立即执行

<script> 
    function fn(a, b) { 
        console.group('fn 函数内的 打印') 
        console.log('this : ', this) 
        console.log('a : ', a) 
        console.log('b : ', b) 
        console.groupEnd() 
     } 
     var obj = { 
         name: '我是 obj 对象' 
     } 
     var arr = [100, 200, 300, 400, 500] 
     // 用 apply 调用 
     fn.apply(obj, [100, 200]) 
     fn.apply(arr, [1000, 2000]) 
     /* 
     fn 函数内的 打印 
      this : {name: '我是 obj 对象'} 
      a : 100 
      b : 200 
      fn 函数内的 打印 
      this : (5) [100, 200, 300, 400, 500] 
      a : 1000 
      b : 2000 
      */ 
</script>

bind调用

作用: 改变函数内部this的指向

语法:

函数名.bind()

对象名.函数名.bind(参数1,参数2,参数3...)

参数:

第一个参数是this要指向的对象

从第二个参数开始,依次给函数传递实参

特点: 函数不会立即调用,会返回一个改变this指向以后的函数,使用的时候需要调用

<script> 
    function fn(a, b) { 
        console.group('fn 函数内的 打印') 
        console.log('this : ', this) 
        console.log('a : ', a) 
        console.log('b : ', b) 
        console.groupEnd() 
     } 
     var obj = { 
         name: '我是 obj 对象' 
     } 
     var arr = [100, 200, 300, 400, 500] 
     // 用 bind 调用 
     // 注意: 因为是 bind, 不会把 fn 函数执行, 而是把 fn 
     // res 接受的就是 bind 方法复制出来的 fn 函数, 和 fn 
     var res = fn.bind(obj, 100, 200) 
     var res1 = fn.bind(arr, 1000, 2000) 
     res() 
     res1() 
     /* 
     fn 函数内的 打印 
     this : {name: '我是 obj 对象'} 
     a : 100 
     b : 200 
     fn 函数内的 打印 
     this : (5) [100, 200, 300, 400, 500] 
     a : 1000 
     b : 2000 
     */ 
</script>

以上即为JS中this指向的一些基础知识点,更多技术干货、知识技巧可以关注我们!有不清楚的问题也可以在评论区交流讨论,也可以私信小千~

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

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

相关文章

Python系列之判断和循环

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、判断语句 1.1 Shell里的判断语句格式 1.2 Python里的判断语句格式 二、循环语句 2.1 Python while循环 2.1.1 while 循环的基本格式 2.1.2 while 循环使用else语句 2.2 Python for 循…

每日学术速递5.16

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Locally Attentional SDF Diffusion for Controllable 3D Shape Generation 标题&#xff1a;用于可控 3D 形状生成的局部注意 SDF 扩散 作者&#xff1a;Xin-Yang Zheng, Hao Pa…

全能视频转换:Tipard Video Converter Ultimate Mac

Tipard Video Converter Ultimate 是一款 Mac 平台上的视频转换工具&#xff0c;它可以帮助用户将各种视频文件转换为不同的格式&#xff0c;以适应不同的设备和播放器。使用 Tipard Video Converter Ultimate&#xff0c;用户可以轻松地将视频转换为 MP4、AVI、WMV、FLV、MKV、…

美股股指期货在哪看?如何选择美股股指期货平台?

美股股指期货的交易方式与股票交易的方式类似。投资者可以通过经纪人或美股股指期货平台进行交易&#xff0c;也可以到股票交易所进行交易。需要注意的是&#xff0c;并非所有的美股股指期货平台都值得信赖。投资者在交易前需要筛选出靠谱的美股股指期货平台。 美股股指期货平台…

12金币问题的解决

title: 12金币 date: 2023-05-16 11:42:26 tags: 数据结构与算法 git地址&#xff1a;https://github.com/944613709/HIT-Data-Structures-and-Algorithms 12金币 **问题&#xff1a;**给出12个硬币&#xff0c;其中一个是假硬币&#xff0c;用一个天平来确定三种重量的假币&a…

AVUE样式、刷新、字典等操作

1、操作栏、表格样式的控制 2、下拉框字典的设置 3、日期格式的设置 const dateFormat function(row, value) { if (!value) return ; let format YYYY-mm-dd; let date new Date(value); const dataItem { Y: date.getFullYear().toString(), m: (date.ge…

Pycharm找不到python版本怎么办?解决方法:ModuleNotFoundError: No module named ‘torch‘

目录 1、conda我的使用版本是2023,04最新的 2、如果使用conda自定义的python的版本的话&#xff0c;那么着实有问题 我发现了我不管使用什么办法&#xff0c;切换到conda里面安装的虚拟机吧&#xff0c;就是找不到&#xff01; 如果直接吧conda作为加载器搞进去呢&#xff0c…

【ChatGPT】ChatGPT国内镜像网站整理

目录 一、什么是ChatGPT镜像&#xff1f;1、二狗问答(AI对话)2、AiDuTu3、WOChat4、ChatGPT(个人感觉最好用) 二、我们可以利用ChatGPT干什么&#xff1f;1、自动化制作PPT2、打造智能问答助手3、提高个人对话的效率4、开发智能客服机器人 一、什么是ChatGPT镜像&#xff1f; …

Vmware配置centos7(简单上手)

Linux操作系统 vmware安装centos71.安装下载VM&#xff08;本次使用VMware Workstation Pro 16&#xff09;2.安装下载镜像&#xff08;本次使用CentOS7-x86_64&#xff09;&#xff08;1&#xff09;进入VMware&#xff0c;创建虚拟机&#xff08;2&#xff09;设置虚拟机&…

秒杀抢购系统架构分析与实战

1 秒杀业务分析 正常电子商务流程 &#xff08;1&#xff09;查询商品&#xff1b;&#xff08;2&#xff09;创建订单&#xff1b;&#xff08;3&#xff09;扣减库存&#xff1b;&#xff08;4&#xff09;更新订单&#xff1b;&#xff08;5&#xff09;付款&#xff1b;&a…

【结构生物学】基于AI辅助的结构蛋白质组学研究细胞内的蛋白质复合体

用交联质谱和共分离质谱识别PPI&#xff0c;并用AlphaFold-Multimer预测蛋白相互作用复合体的结构 期刊介绍 这篇文章是2023年2月23日发表在《molecular systems biology》上的一篇结构生物学文章&#xff0c;这个期刊的影响因子为7.1。 作者介绍 左下图为1985年的弗雷德里克…

CRM软件选型时必备十大功能

很多处在CRM系统选型过程中的企业都要从产品功能出发判断CRM的价值&#xff0c;能否解决业务痛点。但不是每一家企业的采购都知道CRM系统包括哪些功能&#xff0c;今天小编就来带大家了解CRM客户管理软件的十大必备功能&#xff0c;在选型中做到心里有数。 一、销售管理 销…

聚观早报 |苹果头显得到Oculus创始人认可;AI加持Bing市场份额反降

今日要闻&#xff1a;苹果头显得到Oculus创始人认可&#xff1b;AI加持下Bing市场份额不增反降&#xff1b;AI歌手翻唱大火可能涉及多项侵权&#xff1b;小米辟谣武汉总部35岁以上员工只保留10%&#xff1b;特斯拉2023年度股东大会下周召开 苹果头显得到Oculus创始人认可 5 月…

【AGC】接入分发和运营分析相关问题

【关键字】 AGC、分发分析、运营分析 【问题描述】 开发者反馈在应用中接入AGC分发分析、运营分析、事件分析时遇到了一些问题。具体如下所述&#xff1a; 1、事件分析里面的埋点事件参数和参数值是否有数量限制。 2、埋点统计是否是收费项目&#xff0c;是的话是否有免费额…

腾讯VS百度:在AI上下大赌注

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 腾讯控股(00700)最近已经把基础模型和生成式人工智能应用方面的行业突破视为其业务的新增长机会了&#xff0c;并且正在大力投资人工智能&#xff0c;从而增强其现有产品的竞争力和拓展新的机会&#xff0c;比如腾讯已经把…

一步到位:三行CSS代码轻松实现全网站暗黑模式

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

LeetCode_多源 BFS_中等_994.腐烂的橘子

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子周…

给定二叉树的先序遍历有多少种可能的二叉树

title: 给定二叉树的先序遍历有多少种可能的二叉树 date: 2023-05-16 11:42:26 tags: 数据结构与算法 给定二叉树的先序遍历有多少种可能的二叉树 **问题&#xff1a;**给定二叉树的先序遍历有多少种可能的二叉树 git地址&#xff1a;https://github.com/944613709/HIT-Data-St…

使用python进行图片的文字识别

使用python进行图片的文字识别 文章目录 使用python进行图片的文字识别安装 Tesseract OCR安装过程配置系统的环境变量 安装python的第三方库Pytesseract库Pillow库 运行个demo 安装 Tesseract OCR Tesseract OCR 是一款由 Google 团队开发的开源 OCR&#xff08;Optical Chara…

港联证券|新能源大金融双主线发力 沪指探低回升收复3300点

周一&#xff0c;A股三大指数呈现宽幅震荡走势。沉寂许久的新能源板块早盘复苏&#xff0c;保险、券商与部分“中字头”股票午后发力&#xff0c;多主线并进带动市场普涨。截至收盘&#xff0c;上证综指报3310.74点&#xff0c;涨1.17%&#xff1b;深证成指报11178.62点&#x…