javaScript中this指向

本文详细探讨了JavaScript中this的指向问题,包括普通函数调用时this指向window,嵌套函数中的this指向,使用bind、call、apply改变this,回调函数中this的默认指向,箭头函数中this的继承规则,构造函数中this指向新创建的对象,以及setTimeout和setInterval函数中this的指向。通过对这些场景的分析,帮助理解JavaScript中this的关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通函数调用

console.log(this)	//Window
	var aa = {
		name:"aa",
		fun: function(){
			console.log(this)//{name: "aa", fun: ƒ}
		}
	}
	aa.fun()

第一个打印输出语句是由window对象直接调用,所以this指向window,第二个是由aa对象直接调用,所以this指向aa。

var aa = {
		name:"aa",
		fun: function(){
			function f(){
				console.log(this)	//window
			}
			f()
		}
	}
	aa.fun()

与上一个不同的是,在fun函数中嵌套了一个f()函数,当我同样使用aa.fun去调用时,this指向window.这是因为f函数是在fun函数中,是属于普通函数调用,并没用通过aa对象直接调用,而是自执行,这时候f就属于全局函数

var aa = {
		name:"aa",
		fun: function(){
			return function (){
				console.log(this)	//window
			}
		}
	}
	aa.fun()()

在此情况下,aa.fun()是一个普通函数,而我们在调用时,是由window对象直接调用的,所以此时this指向window

var aa = {
		name:"aa",
		fun: function(){
			// console.log(this)//{name: "aa", fun: ƒ}
			function f(){
				console.log(this)
			}
			f.bind(this)()	//{name: "aa", fun: ƒ}
			f.apply(this)	//{name: "aa", fun: ƒ}
			f.call(this)	//{name: "aa", fun: ƒ}
		}
	}
	aa.fun()

在函数调用时,可以使用bind/call/apply来改变this指向,其中bind返回一个函数,而call和aply是返回一个对象
回调函数

function cc(){
		console.log(this)	//window
	}
	var bb = {
		name:"bb",
		fun:function (callback){
			console.log(this)	//object {name:bb,fun:f}
			callback()
		}
	}
	bb.fun(cc)

这是一个回调函数,主函数为bb(),回调函数为cc(),当主函数执行完成后,执行回调函数,回调函数中,默认this指向window,因为本质上是在函数内callback,并不是由对象直接调用
箭头函数

var dd = {
		name:"dd",
		fun:function(){
			console.log(this)	//{name: "dd", fun: ƒ, ee: ƒ}
			var f1= ()=>{
				console.log(this)	//{name: "dd", fun: ƒ, ee: ƒ}
			}
			f1()
		},
		ee:()=>{
			console.log(this)	//window
		}
	}
	dd.ee()
	dd.fun()

箭头函数中是没有this的,所以箭头函数中的this是继承上层作用域中的this
ee是一个函数,这个函数内部的this等同于上层作用域中this指向,而dd.ee()是由window对象直接调用的,所以这里的this指向window (官方解释:this指向定义时的this,而不是使用时的this)
f1是fun函数内的一个函数,当调用fun函数时,会调用f1函数,所以f1函数内this继承fun函数内this,也就指向了dd对象。利用这一点,以后可以用箭头函数来改变this指向。
构造函数

function gg(){
		var name="gg"
		this.fun=function(){
			console.log(this)	//gg {fun: ƒ}
		}
		console.log(this.name)	//undefined
		console.log(this)	//gg {fun: ƒ}
	}
	var obj = new gg()
	obj.fun()

首先构造函数创建一个新对象,然后将作用域赋给这个新对象,这时函数中this就指向了这个新对象,使用new创建的是一个空对象,然后使用this来初始化新创建的对象的属性,这也就是为什么this.name=undefined,因为他并没有被初始化,所以在调用fun方法时,this就指向这个对象。
setTimeOut和setInterval函数

setTimeout(()=>{
		console.log(this)	//window
	},0)
	setInterval(function (){
		console.log(this)	//window
	},1000)

这两个函数都是window对象下的函数,是由window对象直接调用,所以他们内部的this一般直接指向window

就先到这里吧!以后有更多了解再更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值