netabare
2023-01-10 05:38:35 +08:00
因为 JavaScript 一开始就不是一个正经的语言。传说中的 10 天造出来的语言,能期待有多好的设计。
关于性能问题,我的猜测是,因为 JavaScript 是没有类型的,基于原型链的语言,这就意味着属性访问的实现方法和静态强类型 OOP 语言里面的 devirtualization 有很大的差别了。OOP 语言可以通过各种编译期的优化来消除 devirtualization 里面的性能开销,但是 JavaScript 的语言基准太灵活了,所以无法优化。(只是个人不负责任的猜想)
另外一个问题是`with`本身把变量直接引入到上下文里,也就是说,不需要写变量名就可以直接把关联在这个变量上的无论什么垃圾都调用出来。
Kotlin 里面的`with`并不会把变量关联的属性都暴露在上下文里,因为看函数签名就可以知道了:
```kotlin
inline fun <T, R> with(receiver: T, block: T.() -> R): R
```
receiver 是被捕获的变量,类型为 T ,block 是一个 receiver 函数,在这个函数里面,`this`的类型是 T ,也就是说必须显式指明`this`再访问这个变量所有可能的方法和属性。这种 aliasing 的写法,显然比把不管什么垃圾都倒进作用域安全多了。
话说过来在有 extension 的语言里,本身 scope 函数就可以自己随手造出来,当然了,scope 函数本身也涉及到了虚函数 devirtualization 的问题,如果语言运行时没有专门优化的话,是会造成性能问题的。
所以,并不是说「简化代码」就很好了。
至于「造出来的原因」,大概就跟语言设计历史上的各种其他的离谱的设计一样吧,因为当时的人们还没意识到哪些设计是好的,哪些是坏的。现在回过头看,也只是在马后炮了。