js中this指向的总结

js中的this指向问题可谓是老生常谈。我这样的初学者大多数会认为很绕。本篇博客会把this指向问题按照权重进行分级,并指出一些经常出问题的情景。

最轻一级:默认绑定的指向。

这一级就是所谓的没有调用,this指向window。
如下:

function test () {
            console.log(this);
        }
test();

其实这个可以理解为,因为全局的函数,调用时其实可以理解为window调用。

console.log(window.test === test) //true

而这个默认绑定的this指向还有一点,那就是没有明确调用的,this也是window。

function func () {
	function test () {
		console.log(this);//window
	}
	test()
}
func();

这个test函数虽然没有被定义在全局,但执行时没有明确定义this,那么this就是window。

容易出问题的情景

这种函数套函数的this指向问题,容易出在函数作为参数,或者对象上定义的函数之中的函数。具体来说,setInterval,array.forEach等。同学们可以试试手写forEach,就发现问题的根源就是我上面说的默认this指向。而es6箭头函数,就解决了这个问题,还顺便解决了一下arguments中出现的类似问题。

第二轻级:显式调用

这个其实不用赘述了,某函数被调用时,谁调用的函数,this就指向谁。但是要注意上面说的,调用的函数内部如果还有函数,那么这个内部的函数中的this,大家要注意了。

比上面的重一些级:call apply bind

bind其实也是靠call和apply来实现的

Function.prototype.fakeBind = function (_this){
	var self = this;
	return function (){
		self.apply(_this, arguments);
	}
}

需要注意的情景

注意,bind的权重比call和apply高!!也就是说,被bind改过的函数,再被call,也不会被改。

那么暂时我还真没想起来。。。哪个工程师为什么要先bind再call一个函数。。。

权重最高:new!

new一个构造函数的时候,一个函数里的this就是那个空对象,搞什么都不管用,就是那个空对象。

猜你喜欢

转载自blog.csdn.net/weixin_44684919/article/details/88643485
今日推荐