x = 1;
var obj = {
x: 2,
dbl: function () {
this.x *= 2;
x *= 2;
console.log(x);
console.log(this.x);
}
};
// 说出下面的输出结果
obj.dbl();
//解析:this.x指向当前对象,所以this.x *= 2等同于obj.x *= 2
//而x *= 2,在当前作用域中没有找到声明,则在全局作用域下查找是否有x, x *= 2等同于window.x *= 2
//日志打印输出2 4,此时window.x为2, obj.x为4
var func = obj.dbl;
func();
//func()没有前缀,所以func()相当于window.func(),此时func()中的x与this.x均指向window.x
//日志打印输出8 8,此时window.x为8, obj.x为4
var funcBind = obj.dbl.bind(obj);
funcBind();
//func()没有前缀,但是因为通过bind()方法,把funcBind()的作用域与obj的作用域绑定起来,所以func()相当于obj.dbl(),其中x作用域与上面👆一样查找x,只不过此时window.x为8, obj.x为4
//日志打印输出16 8
- 函数在被
直接
调用的时候,其中的this指针永远指向window
- 匿名函数 this总是指向window对象
- 谁执行函数,this就指向谁
- 如果函数new了一下,那么就会创建一个对象,并且this指向新创建的