为什么JavaScript中没有隐含的内容

con*_*tor 16 javascript language-design

在JavaScript中,this访问其属性时必须始终明确说明.例如:

function Frobber(x) {
    this.x = x;
    return this;
}

Frobber.prototype.frob = function () {
    // wrong:
    return x * x;
    // right:
    return this.x * this.x;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用with(this)(已被弃用且通常不赞成),但为什么this范围内的属性不是自动的?我认为这个设计决定必须有理由.

小智 12

它与Python类似.原因很简单:你不能添加它,因为它与在外部作用域中搜索非局部变量的默认作用域规则冲突.这在静态类型语言中是可能的,因为它们的成员this在编译时是已知的.

如果使它成为一个动态决策,例如" x引用this.xif this.x !== undefined和否则变量x"(或者在运行时决定的任何其他规则),该怎么办?这是非常危险的,因为它可以根据this发生的情况影响局部变量,即仅针对某些对象破坏完全有效的代码.另一个问题:应该undeclaredVar = ...添加新的实例属性吗?如果不是,那将是隐式和显性之间的丑陋不对称this.如果它确实创建了一个实例属性,那么你将失去从内部函数设置全局和闭包变量的能力 - 不是太多的损失,很多人会说; 但JS设计者似乎没有想到,因为他们选择全局范围作为默认值.

制作"随意变量"阴影实例属性会不那么危险,但是如果深度嵌套的范围充满了大量的名称,那么this.在大多数情况下你最终会被迫使用- 所以更少的净胜利.为此,和/或出于其他原因,设计师认为捷径是不可行的.