24 JavaScript学习:this

news2024/11/18 17:22:22

this在对象方法中

在这里插入图片描述

在 JavaScript 中,this 的值取决于函数被调用的方式。在对象方法中,this 引用的是调用该方法的对象。

让我们看一个简单的例子:

const person = {
  firstName: 'John',
  lastName: 'Doe',
  fullName: function() {
    return this.firstName + ' ' + this.lastName;
  }
};

console.log(person.fullName()); // 输出 "John Doe"

在这个例子中,fullName 方法内部的 this 引用的是 person 对象,因为 fullName 方法是通过 person 对象来调用的。

但是,this 并不总是指向期望的对象。在 JavaScript 中,函数的执行上下文是动态确定的。这意味着 this 的值取决于函数被调用的方式,而不是它是在哪里被定义的。

例如:

const anotherPerson = {
  firstName: 'Jane',
  lastName: 'Smith',
  fullName: person.fullName
};

console.log(anotherPerson.fullName()); // 输出 "Jane Smith"

在这个例子中,虽然 fullName 方法最初是作为 person 对象的一个属性被定义的,但是当它被 anotherPerson 对象调用时,this 引用的是 anotherPerson 对象,因为它是由 anotherPerson 对象来调用的。

this单独使用

在这里插入图片描述

在 JavaScript 中,this 的值取决于函数被调用的方式。当 this 单独使用时,它的值通常是全局对象(在浏览器中是 window 对象)或者在严格模式下是 undefined

让我们看几个例子来理解:

  1. 在全局作用域中使用 this
console.log(this === window); // 在浏览器中输出 true

在这个例子中,this 在全局作用域中被调用,因此它引用的是全局对象 window

  1. 在函数内部使用 this
function myFunction() {
  console.log(this === window);
}

myFunction(); // 在浏览器中输出 true

在这个例子中,this 在函数 myFunction 中被调用,由于没有明确指定调用对象,因此 this 引用的是全局对象 window

  1. 在严格模式下使用 this
'use strict';

function myStrictFunction() {
  console.log(this);
}

myStrictFunction(); // 输出 undefined

在严格模式下,如果函数内部的 this 没有明确指定,它的值将是 undefined

this在函数中

在这里插入图片描述

在 JavaScript 中,this 在函数中的值是根据函数被调用的方式动态确定的。this 的值可能取决于以下几种情况:

  1. 全局环境下:

在全局环境下调用函数时,this 指向全局对象(浏览器中为 window 对象)。

console.log(this === window); // 在浏览器中会输出 true
  1. 作为对象方法调用:

当函数作为对象的方法被调用时,this 指向调用该方法的对象。

const obj = {
  name: 'Alice',
  sayName: function() {
    console.log(this.name);
  }
}

obj.sayName(); // 输出 'Alice'
  1. 使用构造函数:

当函数作为构造函数被调用时,this 指向新创建的实例对象。

function Person(name) {
  this.name = name;
  this.sayName = function() {
    console.log(this.name);
  }
}

const person1 = new Person('Bob');
person1.sayName(); // 输出 'Bob'
  1. 使用 call、apply 或 bind 显式指定 this 值:

可以使用 callapplybind 方法显式指定函数中 this 的值。

function sayGreeting(greeting) {
  console.log(`${greeting}, ${this.name}!`);
}

const person = { name: 'Emma' };

sayGreeting.call(person, 'Hello'); // 输出 'Hello, Emma!'
sayGreeting.apply(person, ['Hi']); // 输出 'Hi, Emma!'
const sayHi = sayGreeting.bind(person, 'Hi');
sayHi(); // 输出 'Hi, Emma!'

this在事件句柄中

在事件处理函数中,this 的取值取决于事件触发的上下文。一般情况下,以下是常见场景:

  1. DOM 元素中的事件处理函数:

在DOM元素中绑定的事件处理函数中,this 将会指向触发事件的DOM元素。

<button id="myButton">Click me</button>

<script>
document.getElementById('myButton').addEventListener('click', function() {
  console.log(this.id); // 输出 'myButton'
});
</script>
  1. 使用事件监听器绑定的事件处理函数:

在使用 addEventListener 方法绑定事件处理函数时,this 将会指向触发事件的元素。

<button id="myButton">Click me</button>

<script>
function handleClick() {
  console.log(this.id); // 输出 'myButton'
}

document.getElementById('myButton').addEventListener('click', handleClick);
</script>
  1. 箭头函数的情况:

使用箭头函数作为事件处理函数时,箭头函数没有自己的 this 值,它会捕获其定义时的外部作用域的 this 值。

<button id="myButton">Click me</button>

<script>
document.getElementById('myButton').addEventListener('click', () => {
  console.log(this); // 这里的 this 是全局对象,而不是按钮元素
});
</script>

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

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

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

相关文章

element的textarea字体与input字体不一致解决方案

实现 <style scoped> .el-textarea /deep/ .el-textarea__inner{font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif; } </style>效…

【Flutter】极光推送配置流程(小米厂商通道) 章二

前言 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 并且&#xff0c;我大概率不会去修改第一篇文章的内容。 随着我自己在配置公司的项目的同时&#xff0c;我希望一直更新这个推送系列文章。 在章一配置完后&#xff0c;也是出现了一些问题&#xff0c;所以本…

【IC设计】CRC(循环冗余校验)

目录 理论解读CRC应用CRC算法参数解读常见CRC参数模型 设计实战校招编程题分类串行输入、并行计算、串行输出**串行计算、串行输出&#xff08;线性移位寄存器&#xff09;LSFR线性移位寄存器&#xff08;并转串&#xff09;(并行计算)模二除 总结——串行、并行计算的本质参考…

nowcoder——删除公共字符

删除公共字符_牛客题霸_牛客网 (nowcoder.com) 对于这个题其实就是删除字符串1中在字符串2中出现过的字符。我们来分析下解题步骤&#xff1a; 思路一&#xff1a;遍历字符串1&#xff0c;如果遍历到的字符在字符串2中出现&#xff0c;则将该字符之后的所有字符向前移一位。 …

[高质量]2024五一数学建模A题保奖思路+代码(后续会更新)

你的点赞收藏是我继续更新的最大动力&#xff0c;可点击文末卡片获取更多资料 你是否在寻找数学建模比赛的突破点&#xff1f; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 年华东杯&#xff08;A题&#xff09;的全面解析包。这个解决方案包不仅包括完整的代…

[C语言]典型例题:小蚂蚁爬橡皮筋、买汽水问题、导致单词块、菱形打印……

1、小蚂蚁爬橡皮筋问题 假设橡皮筋长4m&#xff0c;小蚂蚁从一端爬向另一端每天爬1m&#xff0c;且每爬了1m&#xff0c;橡皮筋会立马拉伸4m&#xff0c;在理想条件下&#xff0c;小蚂蚁需要爬多少天可以到达橡皮筋的另一端&#xff1f; 不仔细想&#xff0c;我们很可能认为小蚂…

LeetCode 543.二叉树的直径

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5]…

5个Python自动化EDA库

EDA或探索性数据分析是一项耗时的工作&#xff0c;但是由于EDA是不可避免的&#xff0c;所以Python出现了很多自动化库来减少执行分析所需的时间。EDA的主要目标不是制作花哨的图形或创建彩色的图形&#xff0c;而是获得对数据集的理解&#xff0c;并获得对变量之间的分布和相关…

OpenFeign修改HttpClient为Apache HttpClient 5

OpenFeign中http client 如果不做特殊配置&#xff0c;OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求&#xff0c; 由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。 总结为两步&#xff1a; 加依赖改yml 具体操作请往…

uniapp + uView动态表单校验

项目需求&#xff1a;动态循环表单&#xff0c;并实现动态表单校验 页面&#xff1a; <u--form label-position"top" :model"tmForm" ref"tmForm" label-width"0px" :rulesrules><div v-for"(element, index) in tmForm…

基于Springboot+Vue的Java项目-家政服务平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

如果通过Glide 设置图片圆角

要给图片设置一个圆角,通常方法是在ImageView 标签外添加一个CardView 标签,然后设置圆角值,但是今天遇到一个问题就是 RecyclerView Item 中这样操作的话会遇到这样的一个报错: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.rec…

数据结构----顺序表详解

顺序表的定义 顺序表&#xff08;SeqList&#xff09;属于线性表的同一种&#xff0c;它同样具有线性的存储结构&#xff0c;以下是百度百科关于顺序表的定义&#xff1a; 总结下来&#xff0c; 在结构上&#xff0c;顺序表实际上的底层结构就是数组&#xff0c;而顺序表本身也…

链表-----返回倒数第K个节点回文结构的判断相交链表

目录 1.返回倒数第K个节点 2.回文结构的判断 3.相交链表的判断&#xff0c;返回交点 1.返回倒数第K个节点 &#xff08;1&#xff09;返回链表的第k个节点&#xff0c;我们这里的做法是定义两个指针&#xff0c;这两个指针之间相差的是k这个长度&#xff1b;这个过程的实现就…

网络安全知识点

网络安全 1&#xff0e; 网络安全的定义&#xff0c;网络安全的属性。 定义&#xff1a;针对各种网络安全威胁研究其安全策略和机制&#xff0c;通过防护、检测和响应&#xff0c;确保网络系统及数据的安全性。 属性&#xff1a;机密性 认证&#xff08;可鉴别性&#xff09…

手把手带你一起搭建Seata,结合SpringCloud alibaba实战(二)

手把手带你一起搭建Seata&#xff0c;结合SpringCloud alibaba实战&#xff08;二&#xff09; 前言具体实现大致流程配置微服务订单服务库存服务 测试订单服务异常库存服务异常 总结 接下来的一段时间论文解说要暂时放一放&#xff0c;咱们一起来了解下微服务方面的知识&#…

Web-SpringBootWeb

创建项目 后面因为报错&#xff0c;所以我把jdk修改成22&#xff0c;仅供参考。 定义类&#xff0c;创建方法 package com.start.springbootstart.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotati…

使用nacos实现注册中心和配置中心

实现注册中心 在pom文件中导入 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> 在bootstrap.yml中写下如下配置 spring:application:name: c…

安卓中对象序列化面试问题及回答

1. 什么是对象的序列化&#xff1f; 答&#xff1a; 序列化是将对象转换为字节流的过程&#xff0c;以便将其存储在文件、数据库或通过网络传输。反序列化则是将字节流重新转换为对象的过程。 2. 为什么在 Android 开发中需要对象的序列化&#xff1f; 答&#xff1a; 在 An…

一些优雅的监控运维技巧

准备工作 安装 sysstat sudo apt install sysstat查看某个进程的cpu情况 pidstst -u -p 256432查看某个进程的RAM情况 pidstst -r -p 256432查看某个进程的IO情况 pidstst -d -p 256432查看某个进程下的线程执行情况 pidstst -t -p 256432查看指定PID的进程对应的可执行文件…