11

在 JS 代码中使用 Named IIFE 来描述和分组相关代码的优缺点是什么?

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


例子

(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();

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


使用此模式时是否有任何性能、可维护性、可测试性或跨浏览器注意事项?我不相信我见过很多人在野外使用它,但我觉得它可能非常有用

4

2 回答 2

8

我一直认为标签很酷:

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

实际上,这样做通常很愚蠢。相反,分组功能通常属于其自己的功能。

于 2013-03-21T18:14:30.950 回答
6

如果它只在一个地方执行,为什么要把它和它的执行分开呢?

在这种情况下,根本没有理由使用函数(及其开销)——只需内联代码。并且不要在函数名称中隐藏注释,我认为这是一种不好的做法。如果有人将注释与代码分开,那是他的错,不是你的——实际上他也可以在你的 IENFE 中打包完全不相关的东西。

虽然如果您要重用函数(递归)或需要它围绕某些东西构建闭包,这种模式可能很有用,并且命名函数使堆栈跟踪更易于调试,但IE 中存在各种错误。因此,如果您真的不需要它,请避免使用它 - 而您也不需要。

如果你想表达你的注释适用于代码块,你可以明确地使用语句并将你的注释放在它的前面:

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

……尽管这可能会使您的读者感到困惑,就像多余的 IEFE 一样。

于 2013-03-21T15:57:05.423 回答