javascript中this指向问题

文章详细阐述了JavaScript中this的关键概念,包括在全局作用域、对象方法、构造函数、call、apply、bind方法以及箭头函数下的不同指向行为。重点讨论了this如何根据调用方式和上下文确定其引用的对象。
摘要由CSDN通过智能技术生成

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);
		}
	}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值