Javascript函数范围的区别

时间:2015-01-08 06:12:35

标签: javascript function scope

这有什么区别:

(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的副本并将其放在窗口范围内,但第二个示例已经在窗口范围内。使用第一个例子有任何表现或优势吗?

2 个答案:

答案 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使用它作为一种基本的启动技术,只在上下文中显示jQuery的一个对象。
    请参阅:WikiLearn 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