有没有理由使用命名的自调用函数?
例如:
(function foo()
{
alert('Hello World! Named Self Invoking Function Here');
})();
就我的学习而言,这与匿名自调用函数的作用相同,没有额外的优点(您不能在调用后再次调用它),也没有额外的缺点,因为它不会“污染”全局范围(我认为)。
是否有任何时候命名像上面这样的自调用函数是有意义的?
有没有理由使用命名的自调用函数?
例如:
(function foo()
{
alert('Hello World! Named Self Invoking Function Here');
})();
就我的学习而言,这与匿名自调用函数的作用相同,没有额外的优点(您不能在调用后再次调用它),也没有额外的缺点,因为它不会“污染”全局范围(我认为)。
是否有任何时候命名像上面这样的自调用函数是有意义的?
如果您需要一个递归的自调用函数,那么它可能是有意义的:
(function loop(i) {
console.log(i);
i++;
if(i < 10) {
loop(i);
}
})(0);
我使用这种模式定期从服务器轮询数据。这使得代码不那么混乱(尤其是setTimeout
行)。
(function poll() {
$.get("/somedata", function (data) {
// Processing data...
setTimeout(poll, 1000);
});
})();
这对递归很有用,但你应该暂时避免命名函数表达式。直到版本 9,它们才在 Internet Explorer 中得到正确支持。
请参阅:http: //javascript.info/tutorial/functions-declarations-and-expressions
“IE<9 不支持 NFE”
命名自调用函数可以提高可读性。例如,在您通过自调用函数创建多个闭包的情况下,通过提供名称,它可以无害地提高代码的可读性(除了失去旧的 IE 支持,如前所述)。本质上,您正在创建命名代码块,这可能是分解大型函数的好方法。
例如,
function bigFunction() {
(function doTheFirstThing() {
//code here.
})();
(function doTheSecondThing() {
//code here.
})();
}
您可以将其用于初始化,即您必须首先运行的代码行,然后它将调用另一个脚本。
它为我们提供了一种创建递归、自执行函数的方法。在下面的演示中,我创建了一个自执行函数,它递增一个计数器,记录它,然后递归地调用自身:
var counter = 0;
// Create a self-executing function block; however, rather
// than passing in an anonymous, headless function, let's
// pass in a named function.
(function useCounter() {
// Increment and log counter.
console.log(++counter);
// Call *this* function again in after a short timeout.
setTimeout(useCounter, 1000);
})(); // Self-execute.
自调用函数的另一个更常见的用途是数据隐私,其中包含的所有内容仅在这些函数的范围内可用。
有关更多详细信息,请访问https://en.wikibooks.org/wiki/JavaScript/Anonymous_functions