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中有关代码组织概念的文章,其中介绍了两种最常见的模式:对象文字和模块模式 ,以及如何使用它们。