В javascript, что делает этот синтаксис `(function(window,undfined)){}(window)`

Я пытаюсь понять, как «связывать» события JavaScript вместе, как это делает jQuery. Я нашел вопрос здесь, на S.O. это было похоже на мою цель, но я не понимаю код в ответе.

Источник кода

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

Что это обозначает? Что он делает? Это напоминает мне функцию Jquery $(document).ready(){}, но я не знаю, почему этот человек обернул свой код этой анонимной функцией, которая передает window и undefined.

Моя конечная цель — выяснить, как выполнять методы объекта, связывая методы вместе, как в jQuery. Я знаю, что jQuery уже делает это, но я изучаю это в первую очередь для роста как разработчика.


person quakkels    schedule 08.11.2010    source источник
comment
Подробнее об аргументе undefined: stackoverflow.com/questions/3898732/javascript-function /   -  person Christian C. Salvadó    schedule 09.11.2010


Ответы (2)


Он определяет функцию (используя оператор функции, а не оператор функции). Круглые скобки вокруг него гарантируют, что он рассматривается как оператор, а не как оператор.

Затем он немедленно выполняет его, передавая window в качестве аргумента.

По сути, это то же самое, что:

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

… но без промежуточной переменной.

Это не имеет ничего общего с цепочкой функций в стиле jQuery, где каждый метод фактически заканчивается return this (поэтому вызов метода для возвращаемого значения другого метода аналогичен вызову его для исходного объекта).

person Quentin    schedule 08.11.2010
comment
Спасибо за различие между оператором функции и оператором функции. Кроме того, спасибо за указание на то, что цепочка jQuery выполняется с помощью return this, а не приведенного выше синтаксиса. - person quakkels; 08.11.2010

Когда функция вызывается с меньшим количеством аргументов, чем содержит ее сигнатура, последним аргументам присваивается значение undefined.

Таким образом, приведенное выше является окольным способом получить значение undefined, даже если какой-то сумасшедший переопределил его, сказав var undefined= 'hello';. (В любом случае это незаконно в «строгом режиме» ECMAScript Fifth Edition, но кодеры JavaScript иногда делают некоторые странные вещи.)

Однако на самом деле нет веской причины для передачи window таким образом... традиционный способ получить window, если вы не можете полагаться на window, - это напрямую вызвать функцию и использовать this.

В любом случае, это просто защитный код от патологического авторского JavaScript. Это не то, о чем вам следует беспокоиться во время написания собственного кода (в любом случае вы не можете остановить каждый способ, которым кто-то может испортить свою среду JS), и это не имеет ничего общего с цепочкой.

person bobince    schedule 08.11.2010
comment
Спасибо, что объяснили, почему такие аргументы существуют. - person quakkels; 08.11.2010
comment
Да, в строгом режиме вы получите исключение SyntaxError, а в нестрогом коде ES5 присваивание просто молча завершится ошибкой, свойство global.undefined недоступно для записи :-) - person Christian C. Salvadó; 09.11.2010