[英]What is the purpose of these 2 different javascript declarations?
我想我已经想到了这一点,但我希望能够解释清楚 - 这两个javascript片段之间的区别究竟是什么?
;Person1 = (function() {
var FirstName = 'Hello';
var LastName = 'World';
this.sayHello = function() {
alert(FirstName + ' ' + LastName);
};
});
;Person2 = (function() {
var FirstName = 'Hello';
var LastName = 'World';
this.sayHello = function() {
alert(FirstName + ' ' + LastName);
};
})();
一个是用()执行的; 最后,另一个不是。 当我执行新的Person1()。sayHello()或new Person2()时,它们都按预期执行.sowHello(); - 他们留下的是什么? 据我所知,后者是一个关闭,它是由浏览器阅读时执行的,但我还没有完全理解其含义。 谢谢你的帮助!
更新:我错误地在Person2闭包中遗漏了return关键字。 然而,我并没有解决这个问题,因为答案非常有助于描述这样做的含义:)
Person1
是一种相当标准的对象构造函数,意味着用new
调用。 new Person1()
创建一个新对象,并在该对象上创建一个sayHello
方法。
Person2
正在立即执行,这会导致一些问题! 在评估Person2
,将调用该函数(在全局上下文中)。 在该函数的执行中, this
将是window
对象。 执行的函数不返回任何内容,因此Person2
最终未定义:
>>> Person2 = (function() { var FirstName = 'Hello' // ...}; })();
>>> console.log(window.sayHello, Person2);
function() undefined
一个new Person2()
导致了一个TypeError
“Person2不是一个构造函数”。 如果稍微更改一下,可以使Person2
闭包返回一个带有函数的对象:
;Person2 = (function() {
var FirstName = 'Hello';
var LastName = 'World';
return {
sayHello: function() {
alert(FirstName + ' ' + LastName);
}
};
})();
Person2.sayHello();
或者让它返回一个函数(所以你可以使用new Person2()
):
;Person2 = (function() {
var FirstName = 'Hello';
var LastName = 'World';
return function() {
this.sayHello = function() {
alert(FirstName + ' ' + LastName);
};
};
})();
第一个定义函数内联, Person1
保存对它的引用。
第二个相当于不采取任何行动。 你正在定义一个内联函数并立即执行它。 由于函数不返回任何内容,因此Person2
未定义。
这两个例子的行为都不像你描述的那样,所以也许你输错了你的例子?
自调用函数背后的主要动机是避免污染全局命名空间。 您可能有兴趣查看以下资源以供进一步阅读:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.