这两个不同的JavaScript声明的目的是什么?
我想我有这个想法,但我希望cleary有这个解释 - 究竟是这两个JavaScript片段之间的区别是什么?这两个不同的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()或新的Person2()。sayHello(); - 他们留下了什么?根据我的理解,后者是一个在浏览器被执行时执行的闭包,但我还没有完全理解它的含义。谢谢你的帮助!
更新:我错误地省略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);
};
};
})();
非常感谢你的体贴的解释 - 我错误地离开了我在创作的回归Person2关闭。不过,我很高兴我这么做了,因为你的回应让我想起了这样做的'全球'含义。 – TimDog 2010-05-12 15:02:05
谢谢先生。简要回答我想知道的内容:这完全取决于范围。 – TimDog 2010-05-12 15:02:30