在我看来,你的同事多此一举地添加了一个步骤。我会忽略外部的
$(document).ready
,因为它实际上并没有什么影响。
function() {
(function($) {
})(jQuery);
}
将IIFE用作jQuery回调函数的整个主体不会在范围隔离方面提供任何额外的好处。这与代码如下情况相同:
function() {
});
IIFE所做的唯一事情就是让您将jQuery
引用为$
。
现在,如果回调函数中有更多实质性的代码,则使用内部IIFE可能会有一些好处。在下面的示例中,回调包含两个IIFE:
jQuery(function() {
(function($) {
})(jQuery);
(function($) {
})(jQuery);
});
使用IIFE可以在两个代码块之间实现作用域隔离。
回到主要问题:
这让我想到我们是否应该在IIFE内部使用$(document).ready
,或者像我的同事一样使用其他方式。
说实话,即使查看了您的link,我仍然不明白为什么这些做法应该被视为最佳实践。回答问题的人从未解释过为什么它应该成为最佳实践。
看一下
(function($) {
$(document).ready(function() {
});
})(jQuery);
对抗
$(document).ready(function() {
});
实际上,没有任何显著的优势。就像我之前的例子一样,使用IIFE并不提供作用域隔离的优势,除了允许您通过$
引用jQuery
外,什么也没做。
然而,在实际链接的问题中,代码看起来像这样:
(function($) {
$(document).ready(function() {
});
})(jQuery);
在这种情况下,IIFE确实有一个作用,即防止
other code here 1
中使用的变量泄漏到全局范围。但这与
$(document).ready()
完全无关。重构代码如下:
(function($) {
})(jQuery);
jQuery(document).ready(function() {
});
这个答案的寓意是,使用立即执行函数(IIFE)来包裹未在函数内部的松散代码会给你带来好处,而包裹已在函数内部的代码则不会带来任何东西(除非你把引用也算上)。
$
的范围隔离开来,以避免与其他库发生冲突,可以在外部函数中添加$
参数来实现,或者按照您建议的那样,在IIFE中包装准备好的函数。 - charlietfl