2010-05-12 54 views
3

我想我有这个想法,但我希望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关键字。然而,我没有解决这个问题,因为这些答案对描述这样做的含义非常有帮助:)

回答

0

Person1是一个相当标准的对象构造函数类型,用于调用newnew 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); 
    }; 
    }; 
})(); 
+0

非常感谢你的体贴的解释 - 我错误地离开了我在创作的回归Person2关闭。不过,我很高兴我这么做了,因为你的回应让我想起了这样做的'全球'含义。 – TimDog 2010-05-12 15:02:05

0

第一一个内联函数定义一个函数并且Person1持有一个对它的引用。

第二个等于不采取任何行动。你正在内联定义一个函数并立即执行它。由于该函数不返回任何东西,因此Person2未定义。

这两个例子的行为都不如你描述的那样,所以你可能会错误地输入你的例子?

+0

'Person2'可能是未定义的,但它也设置'this.sayHello',它将在'window'对象上创建'sayHello'。 – gnarf 2010-05-12 14:50:18

+0

我的不好 - 你是对的,我的人有一个错字3。我现在编辑它。谢谢。 – TimDog 2010-05-12 14:54:18