使用命名立即调用的函数表达式(IIFE)代替注释

11

使用命名IIFE在JS代码中描述和分组相关的代码的利弊是什么?

我一直在使用这种“模式”来为我的更加过程化的代码提供结构,这些代码只在一个地方执行。


示例

(function hideStuffOnInstantiaton(){
    $('oneThing').hide().removeClass();
    $('#somethign_else').slideUp();
    $('.foo').fadeOut();
}());

我认为这比两者都更可取:

// hide Stuff on Instantiaton
$('oneThing').hide().removeClass();
$('#somethign_else').slideUp();
$('.foo').fadeOut();

由于随着时间推移,评论可能会与代码分离,不明确该评论适用于哪些代码行。

以及:

function hideStuffOnInstantiaton(){
    $('oneThing').hide().removeClass();
    $('#somethign_else').slideUp();
    $('.foo').fadeOut();
};

hideStuffOnInstantiaton();

因为如果只在一个地方执行函数,为什么要将函数和其执行分开呢?


使用这种模式时是否存在性能、可维护性、可测试性或跨浏览器的考虑因素?我认为我没有看到很多人在实际中使用这种模式,但我觉得它可能非常有用。


我不会给我的立即调用函数命名。如果我看到像你这样的代码,我不会期望它被立即调用,因为你可以有 (function a(){ .. });。我更喜欢使用注释来代替。 - TryingToImprove
5
函数名会显示在堆栈跟踪中,因此它可能对调试有用。此外,这是关于此主题的必读资料:http://kangax.github.com/nfe/ - bfavaretto
@bfavaretto - 謝謝你提供的鏈接,我會開始深入研究。 - Zach Lysobey
好的,我永远不会写出像我写的那样的代码 - 但你可以。@bfavaretto提到了堆栈跟踪,这是一个很好的观点。 - TryingToImprove
1
@BishopZ 具体在哪里?另外,为什么不直接链接到http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/? - blong
显示剩余3条评论
2个回答

8

我一直认为标签很酷:

hideStuffOnInstantiaton: {
  $('oneThing').hide().removeClass();
  $('#somethign_else').slideUp();
  $('.foo').fadeOut();
}

实际上,这么做通常是愚蠢的。相反,分组功能通常应放在自己的函数中。


哇,我有点记得以前读过关于标签的内容。它们确实很酷,似乎比我建议的更有意义。 - Zach Lysobey
1
确保权衡使用“酷”语言特性的利弊。从正面来看,它可能比注释更好。另一方面,罕见的语言特性可能会让经验不足的开发人员感到困惑。 - jporcenaluk

6
为什么要将函数与其执行分开,如果它只在一个地方执行?
在这种情况下,根本没有理由使用函数(带有额外的开销)- 只需将代码内联即可。不要将注释隐藏在函数名称中,我认为这是一种不好的做法。如果有人将注释从代码中分离出来,那是他的问题而不是你的问题 - 实际上,他还可能将完全不相关的内容打包到你的IENFE中。
虽然如果您需要重复使用该函数(递归地)或需要构建某些东西的闭包,则此模式可能很有用,并且命名函数使栈跟踪更易于调试,但在IE中存在各种错误。因此,如果您真的不需要,请避免使用它。
如果您想表达您的评论适用于一块代码,您可以明确地使用 block 语句并将您的评论放在其头部:
{ // hide Stuff on Instantiaton
    $('oneThing').hide().removeClass();
    $('#somethign_else').slideUp();
    $('.foo').fadeOut();
}

尽管这可能会像一个多余的IEFE一样让你的读者感到困惑。


很遗憾,我自己非常喜欢并经常使用这种模式。感谢您提供的信息。 - Lucas Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接