为什么将javascript函数包装为匿名

时间:2014-03-18 18:52:31

标签: javascript

在阅读技术教育帖子时,我偶然发现了作者的示例代码。当然。功能的内容不是我发现的好奇,一切都像作者描述的那样有效。

抓住我的是用匿名包装函数(我认为这就是他们所做的)函数。我能用我微薄的知识看到的唯一一件事是它创建了一个分组/容器。

为什么会这样,我应该养成这个习惯。我明白下半部分可能是主观的,所以如果太迟钝则无视。

(function ()
{
   FuncName1 = function (var1, var2, var3)
   {
       ....code n stuff....
   }

   FuncName2 = function (var1, var2)
   {
    .....code n stuff...
   }
 })();

每个人的优秀解释。谢谢。那么我的后续问题是不应该包含所有功能?例如,作者在一个“范围或模块”中包含两个函数。那些不能互相泄漏吗?


所以cookie怪物让作者代码变得更好我会这样做:

(function ()
{
   var FuncName1 = function (var1, var2, var3)
   {
       ....code n stuff....
   }

   var FuncName2 = function (var1, var2)
   {
    .....code n stuff...
   }
 })();

您在评论中所说的关键是使用关键字var将它们保存在包含匿名函数的范围内。不在隐式全局范围中使用var结果。

4 个答案:

答案 0 :(得分:4)

匿名函数创建范围。匿名函数内的任何定义都不会“泄漏”到外部并污染全局命名空间。这使您可以编写更多模块化代码。当您确实需要将块内部的东西导出到全局命名空间时,您可以明确地这样做。

答案 1 :(得分:4)

就像上面提到的那样,它创建了模块化代码。如果你设置匿名函数返回"事物"并且你将它设置为一个变量,你现在有一个名称间隔良好的闭包。

var name = (function() {

   var 
       lastName = 'Moody',
       firstName = Hank
   ;

   return {
      setName: function(newFirstName, newLastName) { 
                   firstName = newFirstName;
                   lastName = newLastName;
                },
      getName: function() { return firstName + " " + lastName; } 


    }

}());

现在您可以获取并设置代码,它仍然存在于自己的范围内! Bam - 模块化设计模式。

name.setName('Clark', 'Kent');
console.log(name.getName); // Will now output Clark Kent

非常强大而简单的设计模式。

更新:

几乎忘记了他们最重要的名字 - IIFE或立即调用函数表达式!

答案 2 :(得分:3)

“因为函数中定义的变量和函数只能在内部访问,而不能在外部访问,因此调用函数提供了一种非常简单的方法来创建隐私。”

http://benalman.com/news/2010/11/immediately-invoked-function-expression/

答案 3 :(得分:3)

此模式称为'模块'在Javascript中,用于信息隐藏。

根据书籍#Javascript:好的部分'。正确的呼叫方式应该是:

(function() {
    ...
}());

(function() {
    ...
})();

另一种方法:

!function() {
...
}();