this 绑定规则
要了解this的绑定规则之前,首先要了解的是this是什么?
this是一种绑定,要找到this绑定的对象:就是要 寻找 “函数被调用的位置”并不是声明的位置。
this有四条绑定规则
- 默认绑定
- 隐式绑定
- 显式绑定
- new绑定
这其中默认绑定、显示绑定、new绑定非常好理解,这里着重要理解的是隐式绑定,因为回调函数的时候常常会存在"隐式丢失"。来看下面的例子
var x = 4;
var obj = {
x: 3,
bar: function () {
var x = 2;
setTimeout(function () {
console.log(x); //----2
console.log(this.x); //----3
}, 1000);
console.log(this.x) // --- 1 这个代表执行顺序
}
}
obj.bar();
//这里两个打印出来的x分别是:
// 3
// 2
// 4
先来看一下代码执行的过程
调用obj.bar()
时,计时器setTimeout执行一秒后将回调函数放入事件队列,继续执行代码输出打印第一个 x 的值。接着浏览器循环事件队列执行回调函数,打印第二个 x 和第三个 x 。
第一个 x 是通过obj
找到的bar
,this
绑定的是obj
,所以打印出obj中的 3 。
第二个 x 是通过 闭包 得到的值为 2 。
第三个 x 是通过回调函数的执行,此时的执行环境或者说函数的调用位置已经不在obj
中了,而全局作用域,this
所绑定的就是window
(实际上setTimeout就是window.setTimeout( ))所以这里打印出的是 4 。