JQuery最佳实践,在IIFE中使用$(document).ready?
我正在看一段代码:
(function($) { // other code here $(document).ready(function() { // other code here }); })(jQuery);
我虽然IIFE执行$(document).ready的function,这段代码是否正确? 或者我可以删除$(document).ready并将代码直接放在IIFE中。
不,IIFE不会在文档准备中执行代码。
1.就在IIFE:
(function($) { console.log('logs immediately'); })(jQuery);
此代码立即运行“立即记录日志”,而文档已准备就绪。
准备好了:
(function($) { $(document).ready(function(){ console.log('logs after ready'); }); })(jQuery);
立即运行代码并等待文档准备就绪并记录“准备好后的日志”。
这可以更好地理解:
(function($) { console.log('logs immediately'); $(document).ready(function(){ console.log('logs after ready'); }); })(jQuery);
这会在窗口加载后立即将“日志”立即记录到控制台,但只有在文档准备好后才会记录“准备好后的日志”。
IIFE不适合准备:
$(document).ready(function(){})
的替代方法是:
$(function(){ //code in here });
更新
从jQuery 3.0版开始,就绪处理程序已更改。
建议只使用以下forms的就绪处理程序。
jQuery(function($) { });
Ready处理程序现在是异步的。
$(function() { console.log("inside handler"); }); console.log("outside handler");
>外部处理程序
>内部处理程序
- 如果你需要DOM准备就绪,你需要使用
$(function() {/* DOM Manipulations goes here})
- 如果你想避免某种名称冲突,你可以用IIFE包装代码
(function($) {/* safely use $ here*/}(jQuery))
你可以结合两种方法:
(function($) { /*Do smth that doesn't require DOM to be ready*/ $(function() { /*Do the rest stuff involving DOM manipulations*/ }); }(jQuery));
IIFE
需要再创造一个范围。 如果删除IIFE
并且不会定义$
(即jQuery.noConflict()
) – 您将收到错误。 jQuery
将定义带有库的javascript文件的所有地方。
所以这不是jQuery最佳实践,它是一个javascript最佳实践。
当执行上下文 (正在评估的当前代码的范围)准备就绪时,IIFE执行这些function。 查看jQuery中有关代码组织概念的文章,其中介绍了两种最常见的模式:对象文字和模块模式 ,以及如何使用它们。