1

我正在观看有关 javascript 的 Douglas crockford 视频,他提到的一件事是,如果您忘记将new用于类,那么它将填充浏览器中的全局命名空间是 window。我想更好地理解这一点,所以我去测试了如下

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

var user = new User("John","Resig");
alert(window.name); // expected to see undefined, but was John Resig
alert(user.name); // this should only show John Resig correctly

var user1 = User("Douglas","Crockford");
alert(window.name); // expected to see Douglas Crockford and shown correctly

现在有两种可能,要么我对全局命名空间的理解是错误的,要么我的例子是错误的。感谢您是否可以让我朝着正确的方向前进。

4

2 回答 2

2

原因thisUser函数中是指windowifnew没有使用。函数的默认值this(在传统 JavaScript[1] 中)是window.

[1] 支持的浏览器'use strict'在严格模式下不会这样。相反,它们会抛出异常,因为thisis undefinedif new, apply, call,bind等没有被使用。见http://jsfiddle.net/ufTq9/

于 2012-09-08T05:51:26.973 回答
0

您可以尝试这样的技巧:

var User = function(first,last){
   if(this == window)
       return new User(first, last);

   this.name = first + " " + last;
}
var normalUser = new User('first', 'last');
var globalUser = User('fname', 'lname');
// it is undefined :D
alert(typeof window.fname);

问题是您new通过检查范围(this关键字)来检查构造中是否使用了关键字,如果不是(this == window),您可以强制new返回一个对象。

于 2012-09-08T06:01:46.063 回答