JavaScript引擎在编译阶段如何解析this关键字?
首先给出你提到的示例代码:
function foo(bar) { this.name = bar; }
问题解答
你的假设部分正确,我们可以按JS引擎的执行阶段拆分说明:
- 你提到的
bar会在编译阶段注册到foo的作用域是完全正确的:bar是foo的形参,属于函数作用域内的显式声明标识符,编译阶段的词法分析环节就会确认它的作用域归属,不需要等到运行时。 - 关于
this.name的解析逻辑:- 编译阶段的处理范围:编译阶段只会对这行代码做语法合法性检查、生成对应的AST节点,不会做任何和
this指向、属性归属相关的解析。因为this是JS的特殊关键字,它的绑定规则完全独立于普通标识符的作用域查找逻辑,编译阶段完全无法确定它的指向,自然也不可能提前解析this.name的指向。 - 你提到的「从作用域解析角度这行代码完全不会被解析」的说法是成立的:作用域解析的核心是确定普通标识符的作用域归属,
this不走作用域查找规则,所以作用域解析环节确实不会处理这行代码里的this相关逻辑。但要注意,这行代码不是完全不参与编译阶段的工作,语法校验、AST生成这些基础编译工作是提前完成的,不会留到运行时。 this的解析全部发生在运行阶段:只有当函数被实际调用时,引擎才会根据函数的调用位置、调用方式确定this的绑定对象:- 用
new调用时,this指向新创建的实例对象 - 用
call/apply/bind显式绑定时,this指向绑定的对象 - 作为对象方法调用时,
this指向调用方法的所属对象 - 非严格模式下直接调用时,
this指向全局对象,严格模式下为undefined
- 用
- 只有
this的绑定完成后,引擎才会执行赋值逻辑:读取当前作用域下bar的值,赋值给this绑定对象的name属性,这部分逻辑全部在运行阶段完成。
- 编译阶段的处理范围:编译阶段只会对这行代码做语法合法性检查、生成对应的AST节点,不会做任何和
内容的提问来源于stack exchange,提问作者Frosty619
相关产品推荐
相关产品推荐

