this
执行上下文:执行上下文指的是 JavaScript 运行代码的环境的抽象概念,JavaScript 代码都在执行上文中运行
由三个部分组成:变量对象、作用域、this 指向
执行上下午分为:全局执行上下文、函数上下文、eval 上下文
执行上下文栈:
-
- 创建执行上下文数组,推入全局上下文
-
- 遇到函数执行,将该浩瀚书推入执行上下文栈
-
- 若函数中执行另一个函数则将另一个函数推入执行上下文栈,否则将函数从上下文栈中推出
-
- 代码执行完成后,将全局上下文推出执行上下文栈
1.this 指向
-
a.硬绑定:bind、call、apply,如果第一个参数不为 null 或空,指向指定对象,否则非严格模式下执行 window 或 global
-
b.new 绑定:指向构造函数
-
c.隐式绑定,通过对象间接调用函数,指向调用点
-
e.箭头函数指向外层 this
-
d.默认绑定:默认绑定指向 window 或 global
涉及面试题:
- 如何正确判断 this?
- 箭头函数的 this 是什么?
function foo() {
console.log(this.a);
}
var a = 1;
foo();
const obj = {
a: 2,
foo: foo,
};
obj.foo();
const c = new foo();
接下来我们一个个分析上面几个场景
- 对于直接调用 foo 来说,不管 foo 函数被放在了什么地方,this 一定是 window
- 对于 obj.foo() 来说,我们只需要记住,谁调用了函数,谁就是 this,所以在这个场景下 foo 函数中的 this 就是 obj 对象
- 对于 new 的方式来说,this 被永远绑定在了 c 上面,不会被任何方式改变 this
说完了以上几种情况,其实很多代码中的 this 应该就没什么问题了,下面让我们看看箭头函数中的 this
function a() {
return () => {
return () => {
console.log(this);
};
};
}
console.log(a()()());