这来自John Resig的Learning Advanced JavaScript#35 http://ejohn.org/apps/learn/#35,名为“当我们忘记使用new运算符时会发生什么?”。

所以他告诉我们名称变量(我假设是window.name)被覆盖了,但是

1)是否在功能User中完成了覆盖,即this.name是否为name设置了新的全局值?

2)如何使用“新用户”(即构造函数?)来防止覆盖window.name变量?是因为“新用户”只是用户的一个实例,而window.name是全局的吗?

谢谢您的帮助。

function User(first, last){
  this.name = first + " " + last;
}

window.name = "Resig";
var user = User("John", name);

assert( name == "John Resig", "The name variable is accidentally overridden." );

最佳答案

在没有User()的情况下调用new会使函数内的this引用全局对象,该对象在浏览器中为window。因此,name对象的window属性被覆盖。另请注意,user将包含值undefined,因为该函数不会返回值。

如果使用new调用该函数,则this将引用从User.prototype继承的空对象。 window.name保持不变,而是设置空对象的name属性。该新对象也由该函数隐式返回,因此user将对其进行引用。

10-07 19:59
查看更多