在javascript中不使用新名称空间的全局命名空间填充

在javascript中不使用新名称空间的全局命名空间填充,javascript,Javascript,我在看Douglas crockford关于javascript的视频,他提到的一件事是,如果您忘记对类使用new,那么它将填充全局名称空间,在浏览器窗口中。我想更好地理解这一点,所以我进行了如下测试 var User = function(first,last){ this.name = first + " " + last; } var user = new User("John","Resig"); alert(window.name); // expected to see und

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

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
现在有两种可能性,要么我对全局名称空间的理解是错误的,要么我的示例是错误的。
如果您能为我设置正确的方向,我将不胜感激。

原因是
如果未使用
新的
,则
功能中的
将指向
窗口。函数(在传统JavaScript[1]中)的默认
this
window


[1] 支持“使用严格”的浏览器在严格模式下不会以这种方式运行。相反,它们将抛出异常,因为如果未使用
新建
应用
调用
绑定
,则
未定义
。请参见

您可以尝试以下技巧:

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
对象。

如果您忘记使用var,您确定他没有说吗?为什么要使用
var User=function(){}
而不是
function User(){}
?是否在浏览器控制台中运行此操作?你是不是在没有使用新软件的情况下先运行的?因为在这里它可以像预期的那样工作:第一个是未定义的,第二个是John,最后一个是Douglas。。。这对我来说是应该的。是的,你是对的。我在同一页上做了几次实验。当我关闭页面并再次加载后,我得到了预期的结果。多亏了汉克斯·内森,事实上我知道应该把它绑在窗户上,以防我不用“新”字。我想测试一下,然后我看到了意想不到的行为,我后来意识到这是由于我在同一页上测试了几次。一旦我关闭它并再次测试,我就得到了想要的行为。