首先,当一个函数调用时,会创建一个执行上下文,这个上下文包括调用栈、传入参数、调用方式,this就指向这个执行上下文。
this不是静态的,而是在运行时被绑定的,它的绑定只取决于函数调用的方式。
5种绑定方式
1.默认绑定
2.隐式绑定
3.显示(硬)绑定
4.new绑定
5.箭头函数绑定
非严格模式下,this指向window,严格模式下指向undefined
本文只讨论非严格模式下
默认绑定
非严格模式
var foo = 123;
function print() {
this.foo = 234;
console.log(this); // window
console.log(foo); // 234
}
print()
这个foo可以说到两句:如果学习过预编译的知识,在预编译过程中,foo和print会放在全局GO中(window对象上)所以,上述代码类似为:
var foo = 123;
function print() {
this.foo = 234;
console.log(this);
console.log(window.foo);
}
window.print()
let/const
let a = 1;
const b = 2;
var c = 3;
function print() {
console.log(this.a);
console.log(this.b);
console.log(this.c)
}
print();
console.log(this.a);
let/const 定义的变量存在暂时性死区,而且不会挂到window上,所以print是无法获取到a和b。
答案
undefined
undefined
3
undefined
对象内执行
a = 1;
function foo() {
console.log(this.a)
}
const obj = {
a: 10,
bar() {
foo(); // 1
}
}
obj.bar()
foo虽然在obj的bar函数中,但foo仍然是独立运行的,foo的this仍然指向window