En javascript, ¿qué hace esta syntax `(function (window, sin definir)) {} (window)` lograr

Estoy tratando de entender cómo "encadenar" events de JavaScript juntos como lo hace jQuery. Encontré una pregunta aquí en SO que era similar a mi objective, pero no entiendo el código en la respuesta.

Código fuente

(function( window, undefined ) { ...etc... }(window) 

Qué significa eso? ¿Qué está haciendo? Me restring a la function $(document).ready(){} de Jquery, pero no sé por qué esta persona envolvió su código en esta function anónima que pasa la window y undefined .

Mi objective final es descubrir cómo ejecutar methods en un object encadenando methods como jQuery. Sé que jQuery ya lo hace, pero estoy investigando esto principalmente para crecer como desarrollador.

Define una function (utilizando un operador de function en oposition a una statement de function ). El paréntesis a su alnetworkingedor asegura que se trata como el operador en lugar de la statement.

Luego lo ejecuta de inmediato, pasando window como argumento.

Básicamente, esto es lo mismo que:

 var myFunction = function( window, undefined ) { ...etc... }; myFunction(window); 

… pero sin la variable intersticial.

Esto no tiene nada que ver con el encadenamiento de funciones de estilo jQuery, donde cada método finaliza efectivamente con return this (por lo que llamar a un método en el valor de retorno de otro método es lo mismo que invocarlo en el object original).

Cuando se llama a una function con less arguments de los que contiene su firma, a los arguments finales se les asigna el valor undefined .

Entonces, lo anterior es una forma indirecta de get el valor undefined incluso si algún lunático lo ha networkingefinido diciendo var undefined= 'hello'; . (De todos modos, esto es ilegal en el "modo estricto" de ECMAScript Fifth Edition, pero los codificadores de JavaScript a veces hacen cosas raras).

Sin embargo, no hay una buena razón para pasar una window como esta … la forma tradicional de get window si no puede confiar en la window es llamar directamente a una function y usarla.

De cualquier manera, esto es simplemente una encoding defensiva contra el autor patológico JavaScript. No es algo de lo que deba preocuparse mientras escribe su propio código (en cualquier caso, no hay manera de que pueda detenerse de la misma manera en que alguien podría arruinar su entorno JS), y no tiene nada que ver con el encadenamiento.