javascript中this指向问题

news/2024/11/29 12:50:24/

JavaScript中this指向问题

1、this指向window的情况

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

在全局作用域下,this = window

	function sum() {console.log(this); }sum(); // windowconsole.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()); // thisconsole.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); // lfjconsole.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就是windowobj1.obj2.eat(); // obj1 // 此时继承的this是上一层作用域链的对象,obj1
	let obj1 = {name : 'xx',say : function() {setTimeout(()=>{console.log(this); // obj1.},1000);}}

在这里插入图片描述


http://www.ppmy.cn/news/48705.html

相关文章

educoder实训——函数【1】

文章目录 无参无返回值函数任务描述代码无参有返回值函数任务描述代码有参有返回值函数任务描述代码多参函数任务描述代码任意数量参数任务描述代码pow函数详解任务描述编程要求代码最大公约数任务描述编程要求代码最小公倍数<

ReetrantLock源码剖析_03公平锁、非公平锁

一直努力就会有offer&#xff0c;一直努力就会有offer&#xff0c;一直努力就会有offer&#xff01; 文章目录 ReetrantLock公平锁代码解析ReetrantLock公平锁执行流程ReetrantLock非公平锁代码解析ReetrantLock非公平锁执行流程公平锁与非公平锁的比较 ReetrantLock公平锁代码…

KDZD608屏蔽服效率测试仪

一、产品概述 KDZD608型屏蔽服效率试验装置&#xff08;带电作业用屏蔽服屏蔽效率试验装置&#xff09;是对屏蔽服进效率试验的专用设备&#xff0c;广泛用于电力系统、生产厂家和科研单位不可缺少的检测设备。KDZD608型屏蔽服效率试验装置根据最新国家标GB6568.2-86《带电作业…

苹果跌倒检测新专利获得,结合苹果Find My可准确定位

苹果首款“跌倒检测”功能专利可追溯到 2018 年公示的 20190103007&#xff0c;后续又获得了至少 5 项相关专利。根据美国商标和专利局&#xff08;USPTO&#xff09;上周四公示的专利&#xff0c;苹果公司再次获得了一项“跌倒检测”功能专利。 苹果在报告中表示&#xff0c…

数据结构和算法面试题系列-栈

0 概述 栈作为一种基本的数据结构&#xff0c;在很多地方有运用&#xff0c;比如函数递归&#xff0c;前后缀表达式转换等。本文会用C数组来实现栈结构(使用链表实现可以参见链表那一节&#xff0c;使用头插法构建链表即可)&#xff0c;并对常见的几个跟栈相关的面试题进行分析…

怎么恢复回收站清空删除的文件

当回收站中的文件被清空时&#xff0c;看到有重要的文件被误删了&#xff0c;该怎么恢复回收站清空删除的文件呢?相信有不少人都碰到过这样的事&#xff0c;那么我们如何解决它呢?首先在发现回收站中的数据丢失后&#xff0c;应尽可能避免一切写操作&#xff0c;以保证丢失的…

Unity之ShaderGraph入门

前言 随着Unity版本的不断升级&#xff0c;URP&#xff08;可编程渲染管线&#xff09;也越来越普及了。不管是从效果还是性能&#xff0c;都是吊打老版的build-in-shader。所以无论如何我们都要开始 拥抱URP&#xff0c;升级Unity的时候到了。 引擎版本 我这里选择了Unity …

第1章:算法基础【AcWing】

文章目录 快速排序题目描述输入格式输出格式样例样例输入样例输出 提示 算法&#xff08;分治&#xff0c;双指针&#xff09; O ( n l o g n ) O(nlogn) O(nlogn)示例代码注意事项时间复杂度稳定性 归并排序题目描述算法&#xff08;分治&#xff0c;双指针&#xff09; O (…