2016-09-22 1 views
-1

Я все еще и снова и снова пытаюсь разобраться с javascript. Я смотрю на другие сценарии для вдохновения и обучения. Кто-нибудь знает, что это такое:javascript: что это: (function (args) {}) (moreArgs) {});

(function(args){})(moreArgs){}); 

Это скелет jquery. Может ли кто-нибудь объяснить мне, как это работает? Спасибо!

Вот еще скелет:

(function(global, factory) { 

})(typeof window !== "undefined" ? window : this, function(window, noGlobal) { 

    return jQuery; 
}); 
+0

Не могли бы вы показать * фактический * код, который вы нашли? – JJJ

+1

Похож на функцию самозапуска, которая закрывает его самоотвод из глобального пространства имен. В настоящее время, хотя у вас есть синтаксическая ошибка. Вы можете исправить это первым? – Stewart

+0

добавлено больше кода выше - что-то более понятно? – Daniela

ответ

0

TLDR;(func)(params); выполняет функцию inplace без необходимости назначать функцию отдельной переменной.


Позволяет разбить этот код на меньшие его элементы. Во-первых, весь код является самоисполняемой функцией. У нас есть анонимная функция.

var add = function (a,b) { return a + b; }; 

Мы можем назвать эту функцию как

add(1,2); 

однако мы также можем обернуть нашу функцию в () и называть его таким же образом.

(add)(1,2); 

И приведет к функции add вызывается. Поскольку JavaScript не различает литералы функций и ссылки на анонимные функции, мы можем использовать один и тот же формат для вызова литерала функции.

(function(a,b){ return a + b; }))(1,2); 

Это формат, используемый вашим кодом для вызова внешней функции. Итак, почему мы хотели бы назвать функцию таким образом? Потому что пространство имен, или отсутствие там. JavaScript имеет глобальное изменяемое пространство имен. Глобальный означает, что все языковые конструкции доступны в том же пространстве имен, что по умолчанию выполняются сценарии. Это не будет такой проблемой, однако все в этом пространстве имен изменено. Таким образом,

Array = {}; 

Будет переопределять функцию конструктора массива. Любые другие скрипты на вашей странице, которые используют Array, перестанут работать, если они еще не закончили выполнение. Это плохо, поскольку это дает непредсказуемое поведение. Итак, как мы это исправим. Один из способов - разместить всю нашу программу в функции. Когда ваша внутренняя функция закрыта, вы больше не находитесь в глобальном пространстве имен javascript. Ваш в области функции и ваш бесплатный переопределить Array, если вы чувствуете необходимость (серьезно, хотя не переопределяете Array).

Таким образом, у нас есть наша функция, которая защищает нашу программу от любых других, работающих на странице, но у нас есть одна проблема. Мы определили функцию, но мы ее не назвали. Javascript выполняется так, как он читается. Когда VM прочитает первую строку вашего js-файла, она выполнит эту строку. Это не относится к коду с функцией. Этот код будет выполняться только при вызове функции. Так как короткая рука () добавляется в конец определенной функции, чтобы гарантировать, что функция вызывается, как только она была загружена виртуальной машиной.

 Смежные вопросы

  • Нет связанных вопросов^_^