this指向问题(1)

1 篇文章 0 订阅
本文探讨了JavaScript中构造函数和定时器函数中this的指向问题,指出定时器内的this指向定时器本身。为了解决this指向问题,提出了两种方案:保存this到一个变量并在定时器内部使用,或者使用箭头函数。然而,箭头函数不适合于字面量对象中的方法,因为它没有自己的作用域,可能会导致意外的结果。
摘要由CSDN通过智能技术生成

一、构造函数中的this


	// 1.普通构造函数的方法调用,this指向当前创建的实例化对象
	function Person(name, age) {
	    this.name = name;
	    this.age = age;
	    this.say = function () {
	        console.log(this.name); //linlin   this指向当前实例化出来的的对象
	        console.log(this); //Person { name: 'linlin', age: 18, say: [Function] }
	    }
	}
	
	let per = new Person("linlin", 18);
	per.say();
	

三、定时器函数中的this【指向定时器本身-如何解决看下面的解释】


	//在say函数里面放一个定时器函数,定时器的作用是隔了1s就执行第一个参数-函数体。
	//相当于是定时器调用这个函数体,是setTimeout去调用它,所以第一个参数函数体里面的this指向setTimeout
	function Person(name, age) {
	    this.name = name;
	    this.age = age;
	    this.say = function () {
	        setTimeout(function () {
	            console.log(this.name); //undefined  
	            console.log(this); //this指向setTimeout
	        }, 1000);
	    }
	}
	
	let per = new Person("linlin", 18);
	per.say();

如何解决this指向问题:

1、【定义一个变量_this存放this,在setTimeout里面使用这个变量_this】


	function Person(name, age) {
	    this.name = name;
	    this.age = age;
	    this.say = function () {
	        var _this = this;
	        setTimeout(function () {
	            console.log(_this.name); //linlin
	        }, 1000);
	    }
	}
	let per = new Person("linlin", 18);
	per.say();

2、使用箭头函数,箭头函数没有自己的作用域,会指向外层作用域。

	
	function Person(name, age) {
	    this.name = name;
	    this.age = age;
	    this.say = function () {
	    	//这里使用箭头函数,this指向了外层作用域,也就是指向了Person构造出来的实例对象。
	        setTimeout(() => {
	            console.log(this.name); //linlin
	        }, 1000);
	    }
	}
	let per = new Person("linlin", 19);
	per.say();
	

四、不适用于箭头函数的场景

字面量写法的对象中不建议用箭头函数。因为箭头函数的this指向外层作用域,而obj是一个对象,没有作用域。

	//(1)字面量对象中的普通函数
	let obj = {
	    name: "zs",
	    age: 18,
	    say: function () {
	        console.log(this.name);  //zs
	    }
	}
	//obj对象调用了say方法,this指向了obj,所以this指向obj
	obj.say();
	
	//(2)字面量对象中使用了箭头函数,this指向外层作用域,但是obj无法产生作用域,也就是this实际指向了window。
	var name= 'ls;
	var obj = {
		name: ‘zs’,
		age: 18,
	    say: ()={
	    	console.log(this.name);  //ls
	    }
	}

	obj.say();
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值