内置[[Call]]与[[Construct]]算法解析及规范条款解读
解读ECMAScript内置[[Call]]与[[Construct]]算法规范条款
让我来拆解ECMAScript规范里这两个核心的内置方法——[[Call]]和[[Construct]],它们分别对应我们日常写代码时调用函数和用new关键字实例化对象的底层逻辑:
9.3.1 [[Call]](thisArgument, argumentsList)
这个内部方法是函数被直接调用时(比如func()或者obj.method())触发的底层逻辑:
- 执行目标函数
F后,会返回一个Completion Record——这是规范定义的执行结果容器,包含了执行成功的返回值或错误信息 thisArgument就是函数执行上下文里的this值,比如普通函数调用时this指向全局对象,箭头函数会继承外层上下文的thisargumentsList作为传入函数的命名参数列表,对应我们写在函数括号里的参数- 执行这个方法时,
NewTarget的值固定为undefined——这是它和[[Construct]]最关键的区别之一,意味着不会触发实例化流程
9.3.2 [[Construct]](argumentsList, newTarget)
这个方法则对应new关键字调用构造函数时的底层逻辑:
- 和[[Call]]类似,执行目标函数
F后同样返回Completion Record - 参数里的
argumentsList依然是传入的命名参数列表 - 核心差异在于
newTarget参数:它代表了当前new操作的目标构造函数,执行时会创建一个新的实例对象,将this绑定到这个实例,同时函数内部的new.target会指向这个newTarget值 - 这个方法的执行流程会触发构造函数的实例化逻辑,比如原型链的绑定、实例属性的初始化等
内容的提问来源于stack exchange,提问作者MaximPro
相关产品推荐
相关产品推荐

