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就是那个空对象,搞什么都不管用,就是那个空对象。