Javascript 命名自调用函数
是否有理由使用命名的自调用函数 例如:Javascript 命名自调用函数,javascript,self-invoking-function,Javascript,Self Invoking Function,是否有理由使用命名的自调用函数 例如: (function foo() { alert('Hello World! Named Self Invoking Function Here'); })(); 据我所知,这与匿名自调用函数的作用相同,没有额外的优点(调用后不能再次调用),也没有额外的缺点,因为它不会“污染”全局范围(我认为) 有没有像上面这样命名一个自调用函数的时候是有意义的?如果您需要一个递归自调用函数,那么它可能是有意义的: (function loop(i) {
(function foo()
{
alert('Hello World! Named Self Invoking Function Here');
})();
据我所知,这与匿名自调用函数的作用相同,没有额外的优点(调用后不能再次调用),也没有额外的缺点,因为它不会“污染”全局范围(我认为)
有没有像上面这样命名一个自调用函数的时候是有意义的?如果您需要一个递归自调用函数,那么它可能是有意义的:
(function loop(i) {
console.log(i);
i++;
if(i < 10) {
loop(i);
}
})(0);
(函数循环(i){
控制台日志(i);
i++;
如果(i<10){
回路(i);
}
})(0);
我使用此模式定期轮询来自服务器的数据。这会减少代码的混乱(尤其是setTimeout
line)
这对于递归很有用,但是您应该暂时避免使用命名函数表达式。只有在版本9之前,Internet Explorer才正确支持它们 见:
“IE命名自调用函数可以提高可读性。例如,在您通过自调用函数创建多个闭包的情况下,通过提供名称,它可以提高代码的可读性,而不会造成任何伤害(如前所述,除了失去旧的IE支持之外)。”本质上,您是在创建命名代码块,这可能是分解大型函数的好方法 e、 g
您可以使用它进行初始化,这是您必须首先运行的代码行,然后它将调用另一个脚本。它为我们提供了一种创建递归、自执行函数的方法。在下面的演示中,我创建了一个自执行函数,该函数递增计数器,记录计数器,然后递归调用自身:
var计数器=0;
//创建一个自动执行的功能块;但是
//而不是传递一个匿名的无头函数,让我们
//传入一个命名函数。
(函数useCounter(){
//增量和日志计数器。
console.log(++计数器);
//在短时间超时后再次调用*this*函数。
设置超时(使用计数器,1000);
})();//自执行。
这是一个命名函数表达式,因此使用命名函数表达式的任何理由都适用。典型的例子是递归:(函数fib(n){返回n可能是因为其中的代码使用了函数名?(相关)下面是一个稍微复杂的示例,在调试时可能会有所帮助:。调用堆栈当前显示b-(匿名函数)
;如果你给它起一个名字,它会说b-a
或类似的东西。顺便说一句,使用Y combinator可以实现它,而无需命名函数。@penartur-你有演示吗?@JaredFarrish举个例子,看看这个(缩小的)fibbonacchi数字计算函数:它没有说“不支持”,而是说“不支持”如果你知道这些怪癖并且知道它不会真正影响你(大多数情况下都是这样),你仍然可以使用它们而不会崩溃。必须阅读以下主题:@Bergi:我没有说“不支持”,我说的是“不正确支持”“。如果你想拆分hears,这里当然有支持和实现的区别,但如果没有正确实现,就会产生不正确支持的效果。无论如何,我的英语措辞对于拆分hears来说太糟糕了,对不起:-/但我不是指你说的,而是指你给出的那句话。@Guffa一旦你说了“不受支持”到此结束。不受支持是不受支持的。您试图添加到其中的任何内容都不会应用于它的明确含义。这与您在函数体的第一行写入return相同。:)在这一点上,所有浏览器都有一定程度的误解。关键字函数是一个提升器,就像var声明一样。所以…,你这样想吧。IEFEs似乎有点过火了。只有在你需要闭包(用于作用域/垃圾收集)时才使用它们,其他任何评论(可能)都可以使用它们“这就足够了。”本·罗伯茨听说过JavaScript标签吗?
(function poll() {
$.get("/somedata", function (data) {
// Processing data...
setTimeout(poll, 1000);
});
})();
function bigFunction() {
(function doTheFirstThing() {
//code here.
})();
(function doTheSecondThing() {
//code here.
})();
}