javascript中this指向问题

news2024/12/27 3:07:38

JavaScript中this指向问题

1、this指向window的情况

对于非箭头函数情况下,谁调用就指向谁,如果函数在全局作用域下调用,里面的this就是window。

在全局作用域下,this = window

	function sum() {
		console.log(this); 
	}
	sum(); // window
	console.log(this); // window

2、this指向对象的情况

  1. 当函数在对象中以方法的形式调用,this指向当前对象
	function sum() {
		console.log(this);
	}
	let obj = {
		name : "sb",
		sum, // 如果Key value名字相同,可以简写
		add : function() {
			console.log(this); 
		}
	}
	console.log(obj.add()); // this
	console.log(obj.sum);	// this
  1. 如果对象里面还有对象,里面的对象还有方法,此时这个方法就是指向最近的对象,

    如果对象的方法里面,还有函数调用,该函数里面的this指向window对象,因为该函数是window调用,并执行的。

	function deletex() {
		console.log(this);
	}
	let obj = {
		name :"sb",
		add : function() {
			console.log(this);
		},
		user : {
			sum : function() {
				deletex();
				console.log(this);
			}
		}
	}
	obj.add(); // obj对象
	obj.user.sum(); // 第一个window  第二个是user对象
  1. 通过构造函数,就是通过构造函数new对象时,this指向当前new的实例对象
	function Person(name,age) {
		this.name = name;
		this.age = age;
		let say = function() {
			console.log(`${this.name} ${this.age} = ${this}`);
		}
	}
	let person = new Person('lfj',26);
	console.log(person.name); // 'lfj';
  1. 通过class 来构造对象,this指向的就是new出来的对象
	class Person {
		constructor(name,age) {
			this.name = name;
			this.age = age;
		}
	}
	let person = new Person('lfj',20);
	console.log(person.name); // lfj
	console.log(person.age);  // 20

3、借助函数的call、apply方法的调用

参数中传入了对象,this就是指传入的对象,参数为空,就是window

call()、apply()都是函数对象的一个方法,它们的作用是改变函数的调用对象,它们的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

	function sayHello() {
		console.log(`hello ${this.name}`);
	}
	let obj = {};
	obj.name = 'Tom';
	obj.sayHello().apply();	// hello undefined 此时的this就是window
	function sayHello() {
		console.log(`hello ${this.name}`);
	}
	let object1 = {};
	let object2 = {};
	object1.name = 'Tom';
	object2.name = 'Jack';
	object2.sayHello = sayHello;
	object2.sayHello.apply(object1); // hello Tom

4、借助函数的bind方法

bind方法和apply和call方法作用一样,区别就是不立即执行和立即执行

	let object1 = {
		name : "lfj",
		say : function() {
			console.log(this.name);
		}
	}
	let object2 = {
		name : "wmz",
		say : function() {
			console.log(this.name);
		}
	}
	object2.say.bind(object1,object1.say);
	// bind并不会立即执行
	object2.say(); // 

5、箭头函数中this的指向

箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承 this

	let obj1 = {
		name : 'lfj',
		say : () => {
			console.log(this);
		}
		obj2 : {
			name : 'wz',
			eat : () => {
				console.log(this);  // obj1
			}
		}
	}
	obj.say(); // window // 会向上一层作用域链继承this,obj1作用域中的this就是window
	obj1.obj2.eat(); // obj1 // 此时继承的this是上一层作用域链的对象,obj1
	let obj1 = {
		name : 'xx',
		say : function() {
			setTimeout(()=>{
				console.log(this); // obj1.
			},1000);
		}
	}

在这里插入图片描述

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

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

相关文章

中电金信:生成式AI热潮下,文本智能走向何方?

突破通用人工智能场景,生成式AI正在向全行业应用进攻。 一个脑筋急转弯,几个月前ChatGPT是这样回答的: 然而,仅仅几个月的迭代,它的回答却让人出乎意料。 看似调侃的对比背后实则是无数次模型训练的支撑。基于数据的激…

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

项目代码发布案例ArgocdGitlab-Runner 1. 项目文件 demo项目放在gitee上需要自取 git clone https://gitee.com/qqmiller/godemo.git1.1 项目代码 apidemo.go package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Defau…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术应用

随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提…

Bugku——应急加固1

来打一下bugku的应急加固靶场,靶场链接:https://ctf.bugku.com/ctfplus/detail/id/2.html 启动环境 1、JS劫持域名 直接访问ip地址,发现是xxx学院二手交易市场,随后被劫持跳转到了一个博客页面。 博客地址就是第一个flag&…

记录踩的坑:python gdal 重采样+坐标系转换

源数据:1/0 二值数据,30m 分辨率,WGS_1984_UTM_Zone_53N 坐标系,东北区域。 目标:将源数据制成与 MODIS tile 的坐标系(Sinusoidal)、分辨率(463.3127165m)都一致的tif。…

padans关于数据处理的杂谈

情况:业务数据基本字段会有如下: Index([时间, 地区, 产品, 字段, 数值], dtypeobject)这样就会引发一个经典“三角不可能定理”,如何同时简约展现分时序、分产品、分字段数据。)一般来说, 1、时序为作为单独的分类&…

10KV高压开关柜怎么进行无线测温

摘要:文章提出了一种用于小车式开关柜的无线测温系统,包括设于小车动触头套管上的温度传感器、环绕设于小车动触头上的电流传感器,温度传感器及电流传感器均分别连接有数据接收处理器,数据接收处理器电连接有设于小车式开关柜上的…

实例分享| anyRTC 部署南京某区城市运行“一网统管”综合调度系统

近年来国家城运中心,加大了对城运信息化系统的建设的投入,通过对城运的信息化建设,提升城市服务能力和现代化管理水平、进一步增强城市竞争力、让信息化切实做到为人民服务的根本能力。 南京市首先提出城市运行”一网统管“的计划&#xff0…

R语言地理空间分析、可视化及模型预测

随着地理信息系统(GIS)和大尺度研究的发展,空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用,其中在空间分析方面扮演着重要角色,与空间相关的包的数量也达到130多个。在本…

Failed to resolve: com.github.adrielcafe:ffmpeg-android-java:2a627f6ecd

背景 项目中有引用 AndroidAudioConverter,引入方式: implementation com.github.adrielcafe:AndroidAudioConverter:0.0.8 gradle同步及编译代码都会报错: Failed to resolve: com.github.adrielcafe:ffmpeg-android-java:2a627f6ecd 原…

带你浅谈下Quartz的简单使用

Scheduler 每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题(jobDetail的实例也是新的) Quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执…

C/C++|物联网开发入门+项目实战|C语言基础|养成好习惯---规范编码方法 -学习笔记(5)

文章目录 养成好习惯---规范编码方法为什么规范编码很重要推荐书籍:规范编码的重要性规范编码,从Tab键开始代码行的规范写法空行和空格,让你的代码更赏心悦目空格空行 谈谈C代码的注释注释符位置 好代码,取名很重要商业代码基本要求&#xff…

Unity 热更新基础HybridCLR:安装部署(HybridCLR手记二)

Win 下 打包时遇到 xxxx\il2cpp\libil2cpp\utils\Il2CppHashMap.h(71): error C2039: hash_compare: is not a member of stdext 这是.net 7发布后最新版本vs改动打破了一些向后兼容性引起。你可以回退2022的旧版本或者使用2019之类的版本。 所以建议使用.net 6 之前的版本进行…

面试官:String s = new String(“xyz“) 创建了几个对象?

这个问题相信每个学习 java 的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必…

Django项目部署在服务器(配置Django+Mysql8.0+Python+Nginx+uWsgi)

Django项目部署在服务器(配置DjangoMysql8.0PythonNginxuWsgi) 项目配置版本服务器阿里云CentOS 7.6数据库Mysql8.0Python3.7.1 一、更新yum并设置自动更新 1、手动更新yum yum update -y2、安装自动更新的插件 yum install -y yum-cron3、设置自动…

面试官:项目中如何解决跨域问题(HttpClient、注解、网关)

为什么会有跨域问题 因为浏览器的同源政策,就会产生跨域。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的…

kafka安装及配置过程

kafka安装及配置过程 kafka 依赖于 zookeeper,zookeeper的安装可看:ZooKeeper的安装和配置过程 先说明一下,集群主机分别是:192.168.127.129,192.168.127.130,192.168.127.131 安装 kafka可以通过官网下…

Polardb 如何替换MYSQL 之 IMCI 列式(2)系统的核心与关键

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群。 本期继续上…

如何docker安装es和kibana以及ik分词器

推荐用portainer进行可视化 1.创建网络--让es和kibana容器互联 docker network create es-net 2.部署单点es docker run -d \ --name es \ -e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ -e "discovery.typesingle-node" \ -v es-data:/usr/sha…

Java垃圾回收机制

Java垃圾回收机制 垃圾回收算法为什么垃圾回收回收哪些内存如何回收Marking-Sweep(标记-清除法)Marking-Compat(标记-整理法) 内存分代年轻代 Minor gc和Major gc的区别常见回收器Serial Garbage CollectorParallel Garbage Colle…