JS/TS函数定义中声明的this形参是否会被自动传入
结论
不存在JavaScript/TypeScript自动为函数传入这个this形参的情况,这个写在参数列表首位的this参数是TypeScript独有的类型声明占位符,不会参与实际运行时的参数传递。
具体规则说明
- TypeScript中,函数参数列表首位出现的
this: 类型语法,是专门提供给类型系统做静态校验用的特殊语法,编译为JavaScript时会被完全擦除,根本不会出现在最终运行的JS代码里。它不占用实际的参数位置,调用函数时完全不需要手动传入对应实参。 - 这个
this声明的唯一作用,是告诉TypeScript编译器:当前函数被调用时,上下文绑定的this值需要符合指定的类型约束,编译器会在编译阶段校验调用场景的this类型是否合规,不会对运行时逻辑产生任何影响。
对应这段once函数的实际逻辑
- 函数内部
const _this = this拿到的this,就是JavaScript函数调用时根据调用规则自动绑定的上下文值,和所谓的"传入this形参"没有任何关系。你给出的调用示例是在模块顶层直接调用once(),ES模块默认运行在严格模式下,这个上下文this就是undefined,刚好匹配声明的this: unknown类型,所以TS不会抛出类型错误。 - 如果把这段TS代码编译为纯JavaScript,会看到once函数的参数列表里根本没有this这一项,只有
fn一个形参,和普通工具函数的写法没有区别。 - 这里特意声明
this: unknown,本质是明确告诉TS:这个once函数不依赖特定的this上下文,任何场景下调用once都不会出现this类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

