this一直是JavaScript中令人头疼的问题,因为我们在使用this时,往往因为调用的方式和执行的作用域而产生不同的this指向。例如下面这两个代码
var obj = {
foo: function () {
console.log(this)
}
}
var foo = obj.foo
foo()
obj.foo()
代码执行后产生了下面两种结果
可以看到没有```obj.```的函数执行之后指向了Window,而```obj.foo```执行后指向的是obj这个对象
这就是因为代码在不同的作用域执行而产生的结果。用一句话总结this指向问题即,谁调用它,它就指向谁。
疑问来了,obj.foo()执行时指向的是obj,这个很容易理解,可为什么调用foo()却指向了window
这是因为在浏览器中,window是顶级作用域,虽然我们在使用方法时没有采用链式调用,可实际上浏览器已经帮我们做了操作。即调用方式为window.foo
执行结果
我们使用var 定义变量时,所有的变量都会挂在到window这个对象上面
所以,我们在调用时,其实就是隐式的使用了window.foo方式,这样一来,foo()指向window也就不难理解了
解决方式
1. bind
执行结果
2. call
执行结果
3. apply
执行结果
3. 箭头函数
执行结果
以上四种方法都可以轻松的改变this指向问题
关于bind和call/apply为什么代码不同这就涉及到了bind和call/apply执行时机问题了,不在本次讨论范围。