箭头函数带来的this变化实例

news2024/9/21 0:39:53

1.不使用箭头函数时

 let Lesson = {
        site: '后盾人',
        lists:['js','css','mysql'],
        show: function (param) { 
            console.log(this);
            // {site: '后盾人', lists: Array(3), show: ƒ}
            return this.lists.map(function(title){
                console.log(this);
                // Window {window: Window, self: Window, document: document, name: '', location: Location, …}
            })
        }
    }
    Lesson.show()

运行结果
第一个console:直接挂载到对象属性上的函数,this指向所属对象
第二个console:未直接挂载到对象属性上的函数,this指向window

2.使用箭头函数

// 2.使用this
    {
        let Lesson = {
            site: '后盾人',
            lists:['js','css','mysql'],
            show: function (param) { 
                console.log(this);
                // {site: '后盾人', lists: Array(3), show: ƒ}
                return this.lists.map((title)=>{
                    console.log(this);
                    // {site: '后盾人', lists: Array(3), show: ƒ}
                })
            }
        }
        Lesson.show()
    }

运行结果
map中改用箭头函数后,this指向了上下文,也就是父级作用域,即这里的Lesson对象。

3.给dom元素添加事件

{
        let Dom = {
            site: '后盾人',
            bind: function() {
                const button = document.querySelector('button')
                button.addEventListener("click",function(){
                    console.log(this)
                })

                button.onclick = function(){
                    console.log(this)
                }
                /**
                 * 这两种写法的效果是一样的,this都指向button对象
                 * 可以理解为onclick这个函数挂载到button对象上的一个属性
                 * 上文提到,直接挂载到对象属性上的函数,this指向所属对象
                */
                 
            }
        }
        Dom.bind()
    }

运行结果
两处this均指向button对象

// 改成箭头函数后
     {
        let Dom = {
            site: '后盾人',
            bind: function() {
                const button = document.querySelector('button')
                button.addEventListener("click",()=>{
                    console.log(this)
                })                
            }
        }
        Dom.bind()
    }

运行结果
改成箭头函数后,this指向父级作用域中的this,即bind函数中的this,而bind函数是挂载到Dom对象上的,因此this指向Dom

4.思考:上面代码中,既要用到button对象,又要用到Dom对象怎么办?

1.使用evenet参数

 // 使用event参数
    {
        let Dom = {
            site: '后盾人',
            bind: function() {
                const button = document.querySelector('button')
                button.addEventListener("click",event=>{
                    console.log(this)
                    console.log(event.target)
                })                
            }
        }
        Dom.bind()
    }

运行结果
此时,this指向Dom对象,event.target指向button对象

3.另外定义一个变量记录Dom作用域的this

// 6 定义self
    {
        let Dom = {
            site: '后盾人',
            bind: function() {
                const self = this
                const button = document.querySelector('button')
                button.addEventListener("click",function(){
                    console.log(this)
                    console.log(self)
                })                
            }
        }
        Dom.bind()
    }

运行结果
此时也能同时拿到Dom对象和button对象

4.使用handleEvent

// 使用handleEvent
     {
        let Dom = {
            site: '后盾人',
            handleEvent: function (event) { 
                console.log(event.target)
                console.log(this)
            },
            bind: function() {
                const button = document.querySelector('button')
                // 事件会自动在传入对象中寻找handleEvent方法
                button.addEventListener("click",this)   
                             
            }
        }
        Dom.bind()
    }

运行结果

5.思考:上面代码中,场景变成两个button,既要用到点击的button对象,又要用到Dom对象怎么办?

 {
        let Dom = {
            site: '后盾人',
            bind: function() {
                // 此时会拿到两个button
                let buttons = document.querySelectorAll('button')
                buttons.forEach(function(elem) {
                    elem.addEventListener('click',function() {
                        // 此时this指向各自点击的button对象
                        console.log(this)
                    })
                })                        
            }
        }
        Dom.bind()
    }

点击各自button后的运行结果

使用箭头函数后

//  两个button时
    {
        let Dom = {
            site: '后盾人',
            bind: function() {
                // 此时会拿到两个button
                let buttons = document.querySelectorAll('button')
                buttons.forEach((elem) =>{
                    console.log(this)//指向Dom对象
                    elem.addEventListener('click',()=> {
                        // 此时this指向各自点击的button对象
                        console.log(this)//指向Dom对象
                    })
                })                        
            }
        }
        Dom.bind()
    }

点击后的运行结果
此时this指向了Dom
再加上event参数

{
        let Dom = {
            site: '后盾人',
            bind: function() {
                // 此时会拿到两个button
                let buttons = document.querySelectorAll('button')
                buttons.forEach((elem) =>{
                    console.log(this)//指向Dom对象
                    elem.addEventListener('click',(event)=> {
                        // 此时this指向各自点击的button对象
                        console.log(this)//指向Dom对象
                        console.log(event.target)//指向点击的button对象
                    })
                })                        
            }
        }
        Dom.bind()
    }

点击各自的button后的运行结果

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

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

相关文章

17. 老板让我手动控制网页渲染速度,说这能反爬虫?我信了。

手动数据延迟加载,真的可以反爬虫 爬虫训练场项目,加速更新中,专栏清单参考 pachong.vip 本次案例需要的代码量特别小,所以咱们再 Nginx 中也进行一下相关配置 文章目录页面逻辑实现接口逻辑实现延迟实现,time.sleep()…

2022年需求最大8种编程语言!(详细解读)

DevJobsScanner 在过去的 14 个月(从 2021 年 10 月到 2022 年 11 月)中分析了超过 1200 万个开发人员职位需求,并从其中挑选了明确需要编程语言的工作机会,得到了 2022 年最受欢迎的 8 种编程语言。 目前市场中需求最高的前八位…

数学建模学习笔记-算法(线性规划模型)-上

目录 线性规划问题 线性规划的matlab标准形式 解析 目标函数 约束条件 使用matlab的linprog函数来进行求解 线性规划问题 数学规划:安排现有资源安排生产,以取得最大效益的问题。 线性规划:目标函数和约束条件均为线性函数 在一组线性…

2023/1/2总结

今天AC了三个有关二叉树的题目: P1827 [USACO3.4] 美国血统 American Heritage_lxh0113的博客-CSDN博客 https://blog.csdn.net/lxh0113/article/details/128522831?spm1001.2014.3001.5502 P1030 [NOIP2001 普及组] 求先序排列_lxh0113的博客-CSDN博客 然后学…

web基础标签

标签分类&#xff1a; 文本标签&#xff1a; 文本标题标签&#xff1a;h1---h6 段落标签&#xff1a; p 水平线&#xff1a; <hr/> 换行符&#xff1a; <br/> 转义字符&#xff1a; 注释标签&#xff1a; <!--注释内容--> 无语义标签&#xff1a; 语义标签…

educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; &#x1f350;任务描述&#x1f350; 本关任务&#xff1a;实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数&#xff0c;以实现线性表中数据的插…

TypeScript中abstract抽象类、抽象成员

TypeScript也支持定义抽象类和抽象类成员。抽象类和抽象类成员都使用abstract关键字来定义 抽象类可以不包含抽象方法&#xff0c;但抽象方法必须存在于抽象类中抽象方法只能定义&#xff0c;不能实现&#xff0c;即没有函数体抽象类不能被直接使用&#xff0c;只能被继承&…

Spring Boot学习篇(五)

Spring Boot学习篇(五) mybatis-plus使用 1.1 配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:s…

《设计模式》代理模式

《设计模式》设计模式的基本原则 《设计模式》单例模式 《设计模式》工厂模式 《设计模式》原型模式 《设计模式》建造者模式 《设计模式》适配器模式 《设计模式》桥接模式 《设计模式》装饰者模式 《设计模式》组合模式 《设计模式》外观模式 《设计模式》享元模式 《设计模式…

HTML5和CSS3 WEB技术开发

HTML5和CSS3 WEB技术开发 B站视频参考&#xff1a;https://www.bilibili.com/video/BV1H44y1k7ze/ 课程目标&#xff1a; 使用HTML5进行网站布局使用CSS3进行网站美化开发精美的商业网站 第一章 HTML5基础 概念&#xff1a; ​ 网页 &#xff1a;互联网的基础&#xff0c;网…

requests请求库(爬取)

文章目录requests模块链接拼接&#xff08;params参数&#xff09;UA伪装&#xff08;headers参数&#xff09;POST请求页面局部信息爬取&#xff08;GET&#xff09;爬取国家药品监督管理监督总局中基于中华人民共和国化妆品生产许可证相关数据爬取图片爬虫分类通用爬虫&#…

分布式存储从FastDFS切换到Minio

什么是Minio 基于官网的介绍如下&#xff1a;MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 从官网的介绍可以看出Minio是一款和FastDFS类似的工具&#xff0c;分布式存储系统。目前在使…

运行MAT项目环境配置中出现的问题及参考方案

MAT项目是用于修复图片中缺失的部分&#xff1a;及为图像中缺失的区域产生视觉吸引力和语义适当的内容。 项目链接&#xff1a;GitHub - fenglinglwb/MAT: MAT: Mask-Aware Transformer for Large Hole Image InpaintingMAT: Mask-Aware Transformer for Large Hole Image Inp…

国内有没有可以全职远程办公的程序员工作?

明作为一个曾经靠兼职开发远程办公来赚钱的程序员&#xff0c;既碰到过无良甲方&#xff0c;开发完了不结尾款&#xff0c;最后通过法律手段才解决问题&#xff1b;也接过自称甲方的中介单&#xff0c;耗费心力拿到尾款&#xff0c;最后发现人家拿的钱比自己还多......这一路兼…

方格取数--数字三角形dp问题

项目场景&#xff1a; 线性dp 数字三角形类问题 问题描述 设有 NN 的方格图&#xff0c;我们在其中的某些方格中填入正整数&#xff0c;而其它的方格中则放入数字0。如下图所示&#xff1a; 某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&am…

WebGL及Threejs学习介绍

一、学习背景及实现的效果 这十年来Web得到了飞速的发展&#xff0c;随着WebGL的普及&#xff0c;网页的表现能力越来越强大&#xff0c;网页上已经可以开始做出很多复杂的动画、精美的效果&#xff1b;还能通过WebGL在网页中绘制高性能的3d图形。随着浏览器的性能和网络、带宽…

github实用搜索技巧

github搜索指令教程一. in:根据某个关键词来进行检索1.关键词:name: 项目名称description : 项目描述readme : 项目帮助文档语法 &#xff1a;language:xx(检索什么语言的内容)组合检索二.根据stars||forks||pushed关键字查找1.数量范围: xxx关键词 stars:>或者:<2.区间范…

Pytorch 数据操作

神经网络所处理的数据类型都为tensor类型数据&#xff0c;我们首先需要导入库torch import torch 使用 arange 创建一个行向量 x。这个行向量包含以0开始的前12个整数&#xff0c;它们默认创建为整数。除非额外指定&#xff0c;新的张量将存储在内存中&#xff0c;并采用基于…

进程替换心得

进程替换 1️⃣ 什么是进程替换 1.我们想让子进程不执行父进程部分代码&#xff0c;执行新的程序时我们需要进行进程替换。 ** 程序替换的原理 ** &#xff1a; 将磁盘中的程序&#xff0c;加载入内存结构。重新建立页表映射&#xff0c;谁执行程序替换就程序建立谁的映射(子…

redis 的 java 客户端

Jedis 客户端 1&#xff09;引入依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…