我是javascript的新手,我读到了the module pattern提供某种命名空间并拥有私人和公共成员,例如:
var module = (function() {
var s = "Hello, i'm private and in closure!";
return {
myString : s,
myFunc: function() { alert(s); }
};
})();
我做看到了它的好处,因为它为您提供了面向对象编程的一些优势。但是我已经看到很多没有分配给变量的IIFE的例子。与你调用的普通函数相比,这(就我所见)没有任何优势:
(function() {
var s = "Hello I'm private!";
$('#myButton').on('click', function() {
alert(s);
});
})();
function Initialize() {
var s = "Hello I'm private!";
$('#myButton').on('click', function() {
alert(s);
});
}
Initialize();
它们都有私有变量,可以避免创建全局变量,并且它们都可以在不向变量返回任何值的情况下执行。 虽然第二个让你可以选择一个好名字,而不是一个没有名字的潜在大型IIFE,让读者知道发生了什么。 The answer我看到everywhere '是为了避免命名空间污染“,但两种方法都是这样做的,第一种方法有点难以理解?
简而言之:
使用IIFE而不是我缺少的正常功能有什么好处?我为什么要使用它们?
答案 0 :(得分:12)
有时您需要同时定义和调用函数,并且只需要一次,因此在这种情况下,匿名函数可以帮助您。在这种情况下,给函数命名然后调用它们只是过剩。
有时您还想为变量创建namespace
。所以anonymous
函数也可以帮助你。例如
(function($) {
$.fn.pluginName = function(opt) {
// implementation goes here...
}
}(jQuery));
在上述情况下,您可以安全地在代码中使用$
作为jQuery
同义词。
如果您使用如下所示的名称定义函数,那么它将使用您定义的函数名创建全局变量。
function myFunction() {
// function code goes here.
}
myFunction();
但如果你定义它没有名字,那么它就不会创建任何全局变量,你的全局命名空间也不会被污染。
(function myFunction() {
// function code goes here.
}());
只有当您需要从代码中的不同位置调用时,带名称的函数才有用。