在阅读技术教育帖子时,我偶然发现了作者的示例代码。当然。功能的内容不是我发现的好奇,一切都像作者描述的那样有效。
抓住我的是用匿名包装函数(我认为这就是他们所做的)函数。我能用我微薄的知识看到的唯一一件事是它创建了一个分组/容器。
为什么会这样,我应该养成这个习惯。我明白下半部分可能是主观的,所以如果太迟钝则无视。
(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结果。
答案 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() {
...
}();