争论进入IIFE

时间:2013-12-29 23:33:13

标签: javascript anonymous-function ecmascript-5

有人能解释并证明哪一个例子“更正确”吗?

A:将对象作为参数传递

(function($){
    $.doStuff();
})(jQuery);

B:在函数中检索对象

(function(){
    var $ = jQuery;
    $.doStuff();
})();

我非常喜欢B因为它的可读性。只有A和B之间的技术差异是B必须再查找一个范围。我认为这是边际差异所以为什么“推荐”A方式?

请注意,jQuery只是示例。重要的是问题的本质:作为参数传递或在函数中检索?

2 个答案:

答案 0 :(得分:2)

如果jQuery库的名称实际上是“jQuery”,第二种方式将工作。这样调用.noConflict()是可能的(虽然不寻常):

window.banana = jQuery.noConflict( true );

然后,你的第一个例子仍然有效:

(function($) {
  $.doStuff();
})( banana );

但你的第二个例子会失败(如书面所示)。当然,您也可以类似地将“banana”这个名称硬编码到第二个名称中,但如果该功能不是由您直接控制,则不能;加上它是“干”违规。

想象一下,你有一个初始化函数被加载到一个单独的JavaScript源文件中;也许这是第三方剧本。如果你想在初始化时调用该函数,如果函数将jQuery引用作为参数而不仅仅假设全局符号是特定的,那么你将具有更大的灵活性。

alienInitializationFunction( banana );
换句话说,

仍然有用。

答案 1 :(得分:1)

两者都是等价的,但我更喜欢第一个例子(作为参数传递),因为它为您节省了一行代码。这也意味着你的函数不包含不必要的逻辑。