12

¿Cuál es la diferencia entre?:

$(function(){

});

y

$(document).ready(function() { 

});

Sé que esperan a que los componentes estén cargados, pero quisiera saber ¿por qué se escriben de manera diferente?.

Pregunta similar de SO en inglés: https://stackoverflow.com/questions/2662778/what-is-the-difference-between-these-jquery-ready-functions

Goyo
  • 1,602
  • 6
  • 18
  • 36
  • Hola José, ¿tu pregunta está inspirada [en esta del sitio en inglés](http://stackoverflow.com/q/2662778/4574)? Si es así deberías mencionarlo y añadir un enlace al final de tu pregunta. – Konamiman Dec 21 '15 at 08:39
  • Entendido. no tanto inspirada ya que la duda me surgió por que estoy desarrollando un proyecto con JQuery, pero igualmente pondré el link ya que es muy similar. – Goyo Dec 21 '15 at 08:42
  • Sorry, what?! no comprendo – Zaibis Dec 21 '15 at 13:19

4 Answers4

9

Oficialmente no hay ninguna diferencia:

Esta función se comporta igual que $(document).ready(), en el sentido de que debería usarse para envolver otras operaciones $() de tu página que dependan de que el DOM ya esté listo.

Puedes verlo en las fuentes:

rootjQuery = jQuery(document);

...

} else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}

Sin embargo, técnicamente sí hay una diferencia que podría ser útil según las circunstancias: $(function() no se ejecutará si jQuery no se ha cargado correctamente, mientras que $(document).ready sí lo hará

Actualización: Tal como se menciona en los comentarios $(document).ready tampoco se ejecutará si jQuery no está cargado. Para conseguir un efecto similar (pero no idéntico) sin jQuery se puede usar window.onload.

Esta respuesta es una traducción de la original en inglés: https://stackoverflow.com/a/2662783/4574 (la última frase no estaba en el original)

Konamiman
  • 5,068
  • 2
  • 21
  • 44
  • 1
    Ya que traducimos, traducimos todo... xDDDD. *Si que hay una diferencia, `$(function(){})` es menos leible (al menos en mi cerebro)* by [`Rosdi Kasim`](http://stackoverflow.com/users/193634/rosdi-kasim) – Jordi Castilla Dec 21 '15 at 12:26
  • ¿Podrías aclarar la última frase: "_`$(function()` no se ejecutará si jQuery no se ha cargado correctamente, mientras que `$(document).ready` sí lo hará_"? Si jQuery no se ha cargado correctamente, ninguna de las dos debería ejecutarse porque `$` no estaría definido y se recibiría un error en ambos casos – Alvaro Montoro Jan 05 '16 at 12:07
  • @AlvaroMontoro Claro que sí, te lo explico de una forma muy sencilla: metí la pata. :-) – Konamiman Jan 05 '16 at 12:40
3

Viendo que la pregunta data del año 2015. Hoy día hay una gran diferencia:

$(document).ready(function() { 

});

ha sido declarado obsoleto en jQuery3 y muy probablemente desaparecerá en jQuery4.

Por lo tanto, para mantener el código actualizado, se recomienda empezar a usar desde ya:

$(function(){

});

en todo nuestro código.

Este cambio viene explicado con toda claridad en la API de jQuery:

jQuery offers several ways to attach a function that will run when the DOM is ready. All of the following syntaxes are equivalent:

$( handler )
$( document ).ready( handler )
$( "document" ).ready( handler )
$( "img" ).ready( handler )
$().ready( handler )

As of jQuery 3.0, only the first syntax is recommended; the other syntaxes still work but are deprecated. This is because the selection has no bearing on the behavior of the .ready() method, which is inefficient and can lead to incorrect assumptions about the method's behavior. For example, the third syntax works with "document" which selects nothing. The fourth syntax waits for the document to be ready but implies (incorrectly) that it waits for images to become ready.

Ver: .ready() en la API de jQuery


JQuery ofrece varias maneras de adjuntar una función que se ejecutará cuando el DOM esté listo. Todas las sintaxis siguientes son equivalentes:

$( handler )
$( document ).ready( handler )
$( "document" ).ready( handler )
$( "img" ).ready( handler )
$().ready( handler )

A partir de jQuery 3.0, sólo se recomienda la primera sintaxis; las otras sintaxis siguen funcionando pero están obsoletas. Esto se debe a que la selección no tiene relación con el comportamiento del método .ready(), que es ineficiente y puede conducir a suposiciones incorrectas sobre el comportamiento del método. Por ejemplo, la tercera sintaxis funciona con "documento" que no selecciona nada. La cuarta sintaxis espera que el documento esté listo, pero implica (incorrectamente) que espera que las imágenes estén listas.


En conclusión: la forma recomendada desde jQuery3 es:

$(function() {
  // Handler for .ready() called.
});

Se puede consultar también las siguientes preguntas:

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
2

Según la documentación:

jQuery( callback ): Enlaza una función a ser ejecutada cuando el DOM haya finalizado su carga. El comportamiento es como $().ready() y deberá ser usado para encapsular otras operaciones que dependan del que el DOM esté cargado.

Mientras que:

.ready( handler ): Especifica una función a ejecutar cuando el DOM está completamente cargado.

Si se ejecuta después de cargado el DOM, su función (normalmente anónima) será ejecutada de inmediato.

Conclusión:

Ambos métodos son sinónimos. El uso de uno u otro es cuestión de que lo prefieras. Yo por ejemplo me gusta mucho el primero pues como lo mencionan es el uso corto.

Recomendación:

Lo recomendable es que utilices el alias jQuery para obtener el comportamiento deseado siempre en tus plugins o componentes (no importa el método que emplees), ejemplos:

Método 1:

jQuery(function( $ ) {
    // Tú código usando aquí el alias «$».
});

Método 2:

jQuery( document ).ready(function( $ ) {
  // Código usando el símbolo «$» (como comúnmente) aquí.
});

Fuentes

Chofoteddy
  • 5,975
  • 5
  • 25
  • 65
0

Esto también es equivalente:

    $(document).on('ready',function() { 

    });

Personalmente recomiendo usar por defecto el método on, y para el caso del metodo ready recomiendo no usarlo, y en su reemplazo mantener el orden de la ejecución de los scripts/funciones cuando sepas que los recursos (elementos/variables, app.js) ya existen en el contexto actual, y/o ejecutar esos mismos script/funciones en callbacks.

César
  • 16,990
  • 6
  • 37
  • 76
JohnTrack
  • 234
  • 1
  • 5