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

时间:2012-09-08 05:25:41

标签: javascript

我正在观看关于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

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

2 个答案:

答案 0 :(得分:2)

原因是this函数User如果未使用window则引用new。函数的默认this(在传统的JavaScript [1]中)是window

[1]支持'use strict'的浏览器在严格模式下不会以这种方式运行。相反,他们会抛出异常,因为如果thisundefinednewapply等未被使用,则callbind。见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个对象。