this 是 JavaScript 中的一个关键字,它的使用方法类似于一个变量,
this 是执行上下文中很重要的一个组成部分。同一个函数调用方式不同,得到的 this 值也不同
普通函数的 this 值由“调用它所使用的引用”决定,其中奥秘就在于:我们获取函数的表达式,它实际上返回的并非函数本身,而是一个 Reference 类型,Reference 类型由两部分组成:一个对象和一个属性值。当做一些算术运算(或者其他运算时),Reference 类型会被解引用,即获取真正的值(被引用的内容)来参与运算,而类似函数调用、delete 等操作,都需要用到 Reference 类型中的对象。
this :调用函数时使用的引用,决定了函数执行时刻的 this 值。
实际上从运行时的角度来看,this 跟面向对象毫无关联,它是与函数调用时使用的表达式相关。
在箭头函数中,不论用什么引用来调用它,都不影响它的 this 值
总结:this在生成器函数、异步生成器函数和异步普通函数跟普通函数行为是一致的,异步箭头函数与箭头函数行为是一致的
在 JavaScript 标准中,为函数规定了用来保存定义时上下文的私有属性[[Environment]]。当一个函数执行时,会创建一条新的执行环境记录,记录的外层词法环境(outer lexical environment)会被设置成函数的[[Environment]]。
var a = 1;
foo();在别处定义了foo:var b = 2;
function foo(){console.log(b); // 2console.log(a); // error
}
这里的 foo 能够访问 b(定义时词法环境),却不能访问 a(执行时的词法环境),这就是执行上下文的切换机制了。
this 则是一个更为复杂的机制,JavaScript 标准定义了 [[thisMode]] 私有属性。[[thisMode]] 私有属性有三个取值。lexical:表示从上下文中找 this,这对应了箭头函数。global:表示当 this 为 undefined 时,取全局对象,对应了普通函数。strict:当严格模式时使用,this 严格按照调用时传入的值,可能为 null 或者 undefined
此文章为3月Day14学习笔记,内容来源于极客时间《重学前端》,推荐该课程。