这有什么区别:
(function() {
function func1(){
console.log(1);
};
func1.prototype.func2 = function(){
console.log(2);
};
window.func1 = new func1();
})();
和此:
function func1(){
console.log(1);
};
func1.prototype.func2 = function(){
console.log(2);
};
我知道第一个例子只会创建内部函数func1的副本并将其放在窗口范围内,但第二个示例已经在窗口范围内。使用第一个例子有任何表现或优势吗?
答案 0 :(得分:3)
第一种情况可以在某种程度上用于封装。不能再使用func1
从窗口范围创建new func1()
个对象。 (但正如RobG在评论中所说,可以使用newFunc1 = new window.func1.constructor()
创建新对象)...
有时,几个JS脚本可能具有相同名称的函数,从而导致冲突。这是一种解决方案,因为func1
在此处是匿名函数的范围。
它也可以作为单身设计模式(不完全是模式)。
假设您要创建一个游戏,游戏需要一个但复杂的gameEngine
对象。可以从任何地方访问游戏引擎,但只需要一个实例。在这种情况下,您可以使用第一种情况来封装游戏引擎的复杂性,只创建一个全局对象并避免与其他外部函数的功能冲突....
第二种情况是正常程序。在第二种情况下,func1
函数(构造函数)是可见的,并且可以使用new func1()
从窗口范围创建任何对象。
答案 1 :(得分:0)
第一名:
此方法中声明的任何变量在全局上下文中都不可见。
例如:
// An immediately-invoked function expression.
(function() {
var foo = "Hello world";
})();
console.log( foo ); // undefined!
如果需要,您可以提供访问者。
jQuery
的一个对象。第二次:
Prototype (something like Object Oriented)
JavaScript创建原型的基本方法。 例如:
// Shape - superclass
function Shape() {
this.x = 0;
this.y = 0;
}
// superclass method
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info('Shape moved.');
};
这将创建Shape
的原型,然后将move
方法添加到该原型中
见Mozilla Site for Detail