面试中的this指向

1 篇文章 0 订阅

近来面试很多小童鞋们,发现只要问到this指向时候都回答不是很好,包括一些老码童鞋,下面我整理了一下,希望能帮到大家


<body>
	<div id="box">box</div>
	<div id="box1">箭头函数</div>
</body>

一、事件调用指向

<script>
	var dom = document.getElementById('box')
	dom.onclick = function(){
		this.style.color = 'red';
		// 谁调用事件,函数中的this指向谁
	}
</script>

二、全局指向

<script>
	console.log(this);	
	// 浏览器环境下,指向window
	// node运行js文件,指向module.exports
	// 函数直接调用指向window	非严格模式
	// 函数直接调用 undefined	严格模式	window.fn 调用是指向window
</script>

三、普通函数


<!-- 减少内存消耗 使用对象管理 -->
<!--   -->
<!-- /**
*	函数内部 
*	(1) this最终指向调用他的对象,和它的声明是没有任何关系的
*	(2) 如果函数被多层对象包含,如果函数被最外层对象调用,this指向的也是它上以及对象
*/ -->
<script>
	var obj = {
		a: 10,
		fn: function() {
			console.log(this)	
		}
	}
	obj.fn();	//obj (1)
	window.obj.fn();	//obj (2)	//window包含obj //obj 包含fn

	var fn1 = obj.fn
	fn1()	// window (1)
	/**
	*	fn1() 实际调用方式 window.fn1();
	*/
</script>

四、构造函数(无返回值)

<script>
	function foo(){
		// obj1 = {};	//对应实例化
		this.num = 1;
		console.log(this);
	}

	var obj1 = new foo();	// 指向obj1对象
	/**
	*	实例化都做了什么?
	*	1. 调用foo函数
	*	2. 自动创建一个对象
	*	3. 把创建出来的对象和实例化的对象进行绑定
	*	4. 如果方法中没有返回值(return),默认返回this对象
	*/

	foo.num = 2;
	foo.prototype.num = 3;
	foo.prototype.fnn = function(){
		console.log(this.num);
	}
	
	var prototype = foo.prototype;
	var fnn = prototype.fnn;

	new foo().fnn();	//	1	new foo() == {}.fnn()	-> this.num = 1;
	prototype.fnn();	//	3	foo.prototype == {}.fnn()	-> foo.prototype.num = 3;
	fnn();				//	undefined	window.fnn();	window 中无num
</script>

四、构造函数(构造函数)

<!-- /*
	有返回值
	如果返回是一个对象,this指向对象本身
	如果返回是一个基本数据类型或者布尔值,this指向实例化对象
	*/ -->
<script>
	function fooh(){
		this.num = 10;
		return '';	//10
		// return 1;	//10
		// return [];	//undefined
		// return {};	//undefined
		// return {num:20};	//20
		// return function(){};	//undefined
		// return null;	//10
		// return true;	//10
		// return false;	//10
		// return undefined;	//10

	}
	var objh = new fooh();
	console.log(objh.num)
</script>

五、箭头函数

<!-- 
箭头函数 在定义时候就决定this指向
根据上下文关系定义this指向
箭头函数 中本身没有this和arguments的
在箭头函数中引用this实际上调用上级作用域的this
对象不能形成对立作用域所以对象中的箭头函数this指向window
 -->
<script>
	var box1 = document.getElementById('box1')
	box1.onclick = function(){
		// setTimeout(function(){
		// 	this.style.color = 'red';
		// 	// this 指向window
		// },1000)
		setTimeout(()=>{
			this.style.color = 'red';
		},1000)
	}
</script>

六、修改this指向

<script>
	var box2 = document.getElementById('box1'), a=1,b=2;
	var obj2 = {
		fn: function(){
			console.log(this);
		}
	}
	obj2.fn.call(box2,a,b);
	obj2.fn.apply(box2,[a,b]);
	obj2.fn.bind(box2)();
	// bind 返回是一个方法需要执行
</script>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值