前端基础(九)_this基本使用、this指向判断、改变this指向的方法

news2025/2/25 14:05:25

前言:

看这个例子:

例:给所有的div标签都添加点击事件,并打印当前节点的内容

<!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>LiuQing</title>
  <style>
    #box {
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="Liuqing"> Liuqing1 </div>
  <div class="Liuqing"> Liuqing2 </div>
  <div class="Liuqing"> Liuqing3 </div>
  <div class="Liuqing"> Liuqing4 </div>
  <div class="Liuqing"> Liuqing5 </div>

  <script>
    var Liuqing = document.querySelectorAll('.Liuqing')
    console.log(Liuqing, 'LiuqingLiuqing')
    // 这里目前先使用  let  声明变量
    for (let i = 0; i < Liuqing.length; i++) {
      Liuqing[i].onclick = function () {
        console.log(Liuqing[i], 'innerHTML')
      }
    }
  </script>
</body>

</html>

在这里插入图片描述
这里点击了Liuqing1、Liuqing3、Liuqing5。

这个例子我们使用了let声明了变量i,来进行循环,现在我们可以不使用这个let,使用this。
首先我们看看还使用var声明i会出现什么问题:

<!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>LiuQing</title>
  <style>
    #box {
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="Liuqing"> Liuqing1 </div>
  <div class="Liuqing"> Liuqing2 </div>
  <div class="Liuqing"> Liuqing3 </div>
  <div class="Liuqing"> Liuqing4 </div>
  <div class="Liuqing"> Liuqing5 </div>

  <script>
    var Liuqing = document.querySelectorAll('.Liuqing')
    console.log(Liuqing, 'LiuqingLiuqing')

    for (var i = 0; i < Liuqing.length; i++) {
      Liuqing[i].onclick = function () {
        console.log(Liuqing[i], 'innerHTML')
      }
    }
  </script>
</body>

</html>

在这里插入图片描述
点击之后,会打印undefined,而不是Liuqing12345。

这是为什么呢???????

 <script>
    var Liuqing = document.querySelectorAll('.Liuqing')
    console.log(Liuqing, 'LiuqingLiuqing')
    for (var i = 0; i < Liuqing.length; i++) {
      Liuqing[i].onclick = function () {
        console.log(Liuqing[i], 'innerHTML')
        console.log(i, 'iiiiiiiii')
      }
    }
  </script>

打印一下i的值:

在这里插入图片描述
发现都是5 what ??? ???

解释:

在点击事件里面打印 i 的值,发现 i 的值一直是 5,但是就 5 个 li,下标从 0 开始到不了 5,所以会报错,那是因为,点击事件只有点击的时候触发,在这之前循环给 li 加点击事件,i 到 5的时候条件不成立,结束循环,所以那时候的 i 就已经到 5。则不能在循环事件的函数中再使用 i。

一、this基本使用

1、this一般在函数中使用,是指包含它的函数作为方法被调用时所属的对象,在不同的地方所代表的含义不同,取决于被调用时所处的上下文环境,即this表示当前调用函数的对象,就是谁调用了这个函数,this就指向谁。
2、在事件处理函数,this指当前触发事件的对象,是函数中用来表示调用这个函数的对象,事件中,由哪个对象触发了事件则this 就是谁。

    var Liuqing = document.querySelectorAll('.Liuqing')
    console.log(Liuqing, 'LiuqingLiuqing')

    for (var i = 0; i < Liuqing.length; i++) {
      Liuqing[i].onclick = function () {
        console.log(Liuqing[i], 'innerHTML')
        console.log(this, "this")
        console.log(i, 'iiiiiiiii')
        console.log("=========================")
      }
    }

在这里插入图片描述
完美的解决了这个问题。

二、this指向判断

函数的this指向 看调用、不看声明
(1)普通函数调用
①函数名() this->windown
(2)事件处理函数调用
①oDiv.onclick = function(){} this->添加事件的元素
  1.1 onclick  点击事件
  1.2 onload  用户进入某个页面的时候触发(onload 事件可用于检测访问者的浏览器类型和浏览器版本,并基于这些信息来加载网页的正确版本。)
  1.3 onunload  用户离开某个页面的时候触发(onload 和 onunload 事件可用于处理 cookie。)
  1.4 onchange  内容变化事件(常结合对输入字段的验证来使用)
  1.5 onmouseover  鼠标移动到HTML元素上方的事件
  1.6 onmouseout  鼠标移出HTML元素上方的事件
  1.7 onmousedown  鼠标按下的时候触发的事件
  1.8 onmouseup  鼠标弹起触发的事件(onmousedown,onmouseup和onclick区别,onclick是鼠标完成点击事件的时候触发的事件)
  1.9 onfocus  元素获取焦点事件
  1.10 onblur  元素失去焦点事件
  1.11 onabort  图像的加载失败
  1.12 ondblclick  双击事件
  1.13 onerror  当加载图像和文档时发生错误
  1.14 onkeydown  键盘按键被按下发生的事件
  1.15 onkeyup  键盘按键被松开发生的事件
  1.16 onkeypress  键盘按键按下并松开发生的事件
  1.17 onmousemove  鼠标移动
  1.18 onresize  窗口或者框架被重新调整大小
  1.19 onselect  文本被选中
  1.20 onreset  重置按钮被点击
  1.21 onsubmit  提交按钮被点击

(3)全局中this指向window对象

(4)对象的方法函数

Var obj = {fn:function(){}}
对象名.方法名()   obj.fn(); this->调用方法的对象(对象名)obj

例1.普通函数this默认指向window

 function fun(){
            console.log(this)  //window
        }        
  fun()  //相当于window.fun()

例2.对象的方法 对象.方法调用this指向该对象

let obj={
         name:'胡歌',
         age:"18",
         speak(){
             console.log(this.name+'今年'+this.age,this)  
             //胡歌今年18   this指向这个对象
            }
        }
obj.speak()  //谁调用这个方法指向谁

例3.函数谁调用指向谁

function constructorFun(name='虹猫蓝兔七侠传',age='16'){
        this.name=name;
        this.age=age;
        this.speak=function(){
             console.log(this.name+'的年龄是'+this.age,this)
            }
        }
        let childObj = new constructorFun('胡歌',20)
        childObj.speak()  
        //胡歌的年龄是20  this指向childObj这个对象 
        //this指向实例
        //比如:vue实例  就是new出来的 在使用中通常会使用this点方法名来使用方法,这些方法都是vue这个类上面的方法。

例4.事件对象 谁触发事件指向谁

 <div id="box">我是id=box盒子</div>
 let boxid = document.getElementById('box')
 boxid.onclick=function(){
        console.log(this)  //指向box这个dom对象
         this.innerHTML='我是用this改变后的innerHTML'
    }

例5.箭头函数this指向外层作用域的this

<div class="box">我是class=box盒子</div>
 let boxclass = document.getElementsByClassName('box')[0]
        boxclass.onclick=()=>{
            console.log(this)  //当前作用域外层this指向window
            this.alert('我是window对象')
        }

总的来说
①方法函数:对象.方法() ; this->调用方法的对象
②普通函数:( window.) 函数名() this->window
③事件处理函数: oDiv.οnclick= function(){} oDiv.onclick() this->添加事件的元素
④全局中的this指向window对象

三、改变this指向的方法

this指向的几种情况以及js简单实现call、apply、bind___六卿

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

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

相关文章

HW14基于规则化的终身学习Regularization-based Lifelong Learning

文章目录一、介绍-终身学习目标数据集任务示例代码-准备数据模型体系结构样本代码-训练和评估Training Pipeline:MAS - Memory Aware SynapseSISCP - Sliced Cramer Preservation二、实验1、baseline2、EWC3、MAS4、SI5、RWalk6、SCP一、介绍-终身学习 目标 一个模型可以打败…

Naive UI 组件使用体验之-级联选择 Cascader

使用场景 地址区域选择 简单使用 安装依赖 npm install naive-ui -D 按需引入之-手动引入 import {NCascader,CascaderOption } from naive-ui 使用 <n-cascader:value"regionValue":options"regionOptions":multiple"false"placehol…

一篇搞懂Python中的随机数

在 python 中生成随机样本的所有你需要的示例列表 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 在这篇博客中&#xff0c;我将演示如何根据不同的需求在python…

Docker三剑客——Docekr Swarm

目录 一、概述 二、Swarm 的核心概念 1. Node&#xff08;节点&#xff09; 2. Service&#xff08;服务&#xff09; 3. Task&#xff08;任务&#xff09; 三、Swarm 服务的运行部分 1. 工作节点 2. 服务、任务和容器 3. 任务和调度 4. 副本服务和全局服务 四、Swa…

3. 【prometheus 学习】prometheus数据类型

prometheus 四种数据类型学习及测试 安装 1&#xff09;从官网下载对应版本的二进制压缩包并解压 2&#xff09;新建prometheus.yml 文件&#xff0c;静态指定抓取本机的9091端口&#xff0c;设置采样时间2秒1次&#xff0c;方便一会测试。 scrape_configs:- job_name: defin…

单细胞UMAP图只标记特定细胞群、圈定细胞群及坐标轴修改

最近有小伙伴私信我&#xff0c;如下的单细胞UMAP图怎么做&#xff1f;是啥样的图呢&#xff1f;就是UMAP图上其他群是灰色的&#xff0c;只有某个群或者某几个群是标记颜色的&#xff0c;比较突出。其实很简单&#xff0c;一种办法可参考我们之前写过的ggplot做UMAP图&#xf…

uni-app使用蓝牙

目录 前言 连接蓝牙 开启蓝牙适配器 发现蓝牙 连接蓝牙 收发蓝牙数据 获取服务ID 获取特征值 读取蓝牙数据 写蓝牙数据 遇到的坑 获取serviceId的坑 特征值不支持读写 notify成功后立刻写蓝牙数据 工具方法 前言 原因是公司要搞个共享单车给内部员工使用&#…

32位浮点数表示方法

今天开始给大家介绍计算机组成原理课程&#xff0c;本文主要内容是32位浮点数表示方法。 一、32位浮点数构成 32位浮点数是计算机中常见的一种数据类型&#xff0c;该数占据32bit空间&#xff0c;可以表示较大范围内的整数和小数。32位浮点数由三部分组成&#xff0c;分别是符…

Java集合List、Set、Map底层源码解析

目录集合介绍MapHashMapLinkedHashMapHashTablePropertiesCollectionListArrayListVectorLinkedListSetHashSetLinkedHashSetTreeSet集合介绍 为什么使用集合&#xff1f; 当我们想要保存一组数据时&#xff0c;可以使用到的变量类型有集合和数组。那么就像说一下数组的局限性…

1.9

完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleedit回调…

springboot+xxl-job初体验

在日常开发中经常遇到任务调度的需求&#xff0c;下面体验一下分布式调度xxl-job。 1、常见定时任务的实现方式 Java自带的java.util.Timer类ScheduledExcutorServiceSpringboot自带的EnableScheduling注解Quartz框架Elastic-job框架XXL-JOB框架 下面对xxl-job实现任务调度尝…

【TypeScript】TS进阶-函数重载(七)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

一文读懂电商数字员工究竟是什么?| RPA铺第1期

百度的曦灵&#xff0c;中核的核小智、万科集团数字员工“崔筱盼”都曾在2022年度爆火&#xff0c;数字员工一夜之间成为众多行业追捧的对象&#xff0c;那么&#xff0c;他/她们究竟代表着什么&#xff0c;对企业而言&#xff0c;是噱头大于收益&#xff0c;还是收益大于噱头呢…

简单的客户端服务器(多线程)基于json通信

这是一个客户端和服务器通信的小项目&#xff0c;小编自己手写了一个json工具&#xff0c;测试比jsoncpp&#xff0c;protobuf "效率更高"&#xff08;浅拷贝&#xff09;&#xff0c;改写成深拷贝效率会急剧下降&#xff08;小编能力有限&#xff0c;知识点&#xf…

技术分享 | Spring Boot 异常处理

说到异常处理&#xff0c;我们都知道使用 try-catch 可以捕捉异常&#xff0c;可以 throws 抛出异常。那么在 Spring Boot 中我们如何处理异常&#xff0c;如何更优雅的处理异常&#xff0c;如何全局处理异常。是本章讨论解决的问题。Java 异常类首先让我们简单了解或重新学习下…

Android开发-AS学习(一)

完整项目最精简流程&#xff1a;Android <-> 接口 <-> 数据库Android开发工具&#xff1a;Android Studio项目目录信息&#xff1a;一、控件1.1 TextView基础属性描述layout_width组件的宽度layout_height组件的高度id为TextView设置一个组件idtext设置显示的文本内…

Linux 学习笔记(借鉴黑马程序员Linux课程)

Linux视频课程 简介 Linux诞生于1991年&#xff0c;由林纳斯托瓦兹在21岁时完成。此后成为最为流行的服务器操作系统之一。 Linux内核和系统发行版 由Linux系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能&#xff0c;如&#xff1a;调度CPU、调度内存、调…

【笑小枫的按步照搬系列】Redis多系统安装(Windows、Linux、Ubuntu)

笑小枫&#x1f495; 欢迎来到笑小枫的世界&#xff0c;喜欢的朋友关注一下我呦&#xff0c;大伙的支持&#xff0c;就是我坚持写下去的动力。 微信公众号&#xff1a;笑小枫 笑小枫个人博客&#xff1a;https://www.xiaoxiaofeng.com Windows 下安装 方式一&#xff1a;https…

HCL(新华三模拟器)如何连接CRT及改界面颜色

我使用的HCL版本是2.1.1官网下载连接&#xff1a;https://www.h3c.com/cn/Service/Document_Software/Software_Download/Other_Product/H3C_Cloud_Lab/Catalog/HCL/&#xff0c;一键直达下载官网这个版本可以适配virtualbox的5.2.44的版本&#xff0c;同时支持华为的ensp模拟器…

Spring Security 表单配置(一)

Spring Security 表单配置&#xff08;一&#xff09;工具版本及环境参考资源配置详细说明工具版本及环境 工具&#xff1a; IDEA 2021.3 Maven 3.8.6 JDK 8 Spring Boot 2.7.7 Spring Securiity 5.7.6 参考资源 Spring Security官网: https://docs.spring.io/spring-security…