我正在观看关于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
现在有两种可能性,要么我对全局命名空间的理解是错误的,要么我的例子是错误的。 感谢您是否可以让我朝着正确的方向前进。
答案 0 :(得分:2)
原因是this
函数User
如果未使用window
则引用new
。函数的默认this
(在传统的JavaScript [1]中)是window
。
[1]支持'use strict'
的浏览器在严格模式下不会以这种方式运行。相反,他们会抛出异常,因为如果this
,undefined
,new
,apply
等未被使用,则call
为bind
。见http://jsfiddle.net/ufTq9/
答案 1 :(得分: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
个对象。