在javascript中不使用新名称空间的全局命名空间填充
我在看Douglas crockford关于javascript的视频,他提到的一件事是,如果您忘记对类使用new,那么它将填充全局名称空间,在浏览器窗口中。我想更好地理解这一点,所以我进行了如下测试在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
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。。。这对我来说是应该的。是的,你是对的。我在同一页上做了几次实验。当我关闭页面并再次加载后,我得到了预期的结果。多亏了汉克斯·内森,事实上我知道应该把它绑在窗户上,以防我不用“新”字。我想测试一下,然后我看到了意想不到的行为,我后来意识到这是由于我在同一页上测试了几次。一旦我关闭它并再次测试,我就得到了想要的行为。