You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin JS中扩展函数调用时首个参数是否用作接收者?

Kotlin带接收者构建器语法解惑

1. 带接收者函数类型的调用逻辑

SVGAttributes<*>.() -> Unit这种带接收者的函数类型,Kotlin在底层会把它处理成接收一个目标对象作为参数的函数,只是语法上允许你在lambda里直接用this指代这个目标对象。

当你调用building(obj)时,obj就被当作这个函数的接收者绑定进去了——lambda里的width = 100.0其实是this.width = 100.0,这里的this就是obj,所以能直接给obj添加属性。

2. 为什么obj.building()不生效

building是svgB的函数参数,它是一个独立的函数实例,并不是obj的成员方法。你用js("{}")创建的是空动态对象,本身没有building这个方法,自然没法通过obj.building()调用。

3. 调用svgB{ ... }时无需传接收者的原因

这是Kotlin的带接收者lambda语法糖:当函数的最后一个参数是带接收者的函数类型时,你可以把lambda写在函数括号外面,而且lambda内部的this会自动绑定到函数内部准备好的接收者对象(也就是svgB里的obj)。

你写的svgB{ width = 100.0 ... },本质上是Kotlin帮你完成了“把obj作为接收者传给lambda”的操作,不用你手动传入。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:49:57