关于this的指向问题

目录


本篇博客不具有参考性,只供自己思考

关于这个问题,我们常听到一句话:

谁调用它,它就指向谁。

总结

  1. window调用指向window
function fn(){
	alert(this);
}
btn.onclick = function(){
	fn();
}
  1. 点击事件中,指向当前被点击对象
btn.onclick = function(){
	alert(this);
}

btn.onclick = fn;
function fn(){
	alert(this);
}

3.点击事件中,间接this,谁调用指向谁

function fn(){
	alert(this);
}
btn.onclick = function(){
	fn();
}

4.obj 对象中的直接this指向当前对象

var obj = {
	name:"";
	show:function(){
		alert(this);
	}
}

5.new后面是对象的构造函数,构造函数中的this指向当前对象


具体

先观察以下几段代码。

场景一

	alert(this);
	//弹出[object window]
	//window.alert(this); 省略了window

js中规定,如果指向window,则window可省略。

场景二

<body>
<button id="btn">点击</button>
</body>
<script>
	var btn = document.getElementById("btn");
	btn.onclick = function(){
		alert(this);
	}
</script>
//点击后弹出[object HTMLButtonElement]

场景三

<body>
<button id="btn">点击</button>
</body>
<script>
	function fn(){
		alert(this);
	}
	fn();
	//=>指向window
</script>
<body>
<button id="btn">点击</button>
</body>
<script>
	var btn = document.getElementById("btn");
	function fn(){
		alert(this);
	}
	btn.onclick = function(){
		fn();
	}
	//=>指向window
</script>
<body>
<button id="btn">点击</button>
</body>
<script>
	var btn = document.getElementById("btn");
	function fn(obj){
		alert(obj);
	}
	btn.onclick = function(){
		fn(this);
	}
	//点击后弹出[object HTMLButtonElement]
</script>

场景四

<body>
<button id="btn">点击</button>
</body>
<script>
	var btn = document.getElementById("btn");
	btn.onclick = fn;
	function fn(){
		alert(this);
	}
	//点击后弹出[object HTMLButtonElement]
</script>

再稍作改动一下

<body>
<button id="btn">点击</button>
</body>
<script>
	var btn = document.getElementById("btn");
	btn.onclick = fn();
	function fn(){
		alert(this);
	}
	//直接弹出[object window]。直接调用,点击失效。
	
</script>

没有括号是赋值,有括号是调用。

场景五

<body>
<button id="btn">点击</button>
</body>
<script>
	var a = {
		name:"zhangsan",
		show:function(){
			alert(this.name);//this指向a
		},
	}
	a.show();
	//弹出“zhangsan”
</script>

以下是一段问题代码

<body>
<button id="btn">点击</button>
</body>
<script>
	var obj = {
		student:["张三","李四","王五","赵六"],
		showStudent:function(){
			//this放在这里就指向obj
			return function(){
				var num = parseInt(Math.random()*4);
				console.log(this.students[num]);//this指向window,无法指向obj
			}
		}
	}
	obj.showStudent();
</script>

修改一下

<body>
<button id="btn">点击</button>
</body>
<script>
	var obj = {
		student:["张三","李四","王五","赵六"],
		showStudent:function(){
			//this=》obj
			var This = this;
			return function(){
				var num = parseInt(Math.random()*4);
				console.log(This.students[num]);
			}
		}
	}
	var f = obj.showStudent();
	f();
</script>

矫正this指向
1.传参 2.变量存储

this.num=10;
This = this;
axios.get(function(){
	This .num
})

function fn(){
	var a = 10;
	return a;
}
var b = fn();

return出去的必须要有东西接,不然会造成内存泄漏。

//错误案例
if(1==1){
	return;//终止程序运行
}else{

}

function fn(){
	var a = 10;
	return a;
}
var b = fn();

break中止for循环,循环外代码继续执行。

function fn(){
	return false;//阻止默认事件,比如表单默认提交,鼠标右键事件
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值