JavaScript более непринужден по сравнению с другими языками программирования, поэтому код JavaScript полон всех видов странных методов написания. Иногда вы можете видеть цветы в тумане. Конечно, способность понимать различные виды написания методов также является еще одним глубоким пониманием характеристик языка JavaScript.
(function () {…}) () и (function () {…} ()) - два распространенных способа немедленного выполнения функций в JavaScript. Сначала я думал, что это была анонимная функция, завернутая в кронштейн, а затем добавил кронштейн, чтобы вызвать функцию. Наконец, я достиг цели выполнения его сразу после определения функции. Позже я обнаружил, что причиной добавления кронштейнов не была такой. Чтобы немедленно понять выполнение функций, вам нужно сначала понять некоторые основные концепции функций.
Объявления функций, выражения функций, анонимные функции
Объявление функции: function fnname () {…}; Используйте ключевое слово функции, чтобы объявить функцию, а затем укажите имя функции, называемое объявлением функции.
Функция выражения var fnname = function () {…}; объявить функцию с использованием ключевого слова функции, но не называет функцию. Наконец, анонимной функции присваивается переменная, называемая экспрессией функции, которая является наиболее распространенной формой синтаксиса экспрессии функции.
Анонимная функция: function () {}; Используйте ключевое слово функции, чтобы объявить функцию, но функция не называется, поэтому оно называется анонимной функцией. Анонимные функции принадлежат к выражениям функций. Анонимные функции имеют много функций. Если вы назначаете переменную, вы создаете функцию, и если вы назначаете событие, вы становитесь обработчиком событий или создаете закрытие и т. Д.
Разница между объявлением функции и выражением функции заключается в том, что 1. Когда анализ кода JavaScript, двигатель JavaScript будет «Объявление функции» (Promotion 'Proparation »(Объявление функции) Объявление функции) Объявление функции в текущей среде выполнения (Scope). Выражение функции должно подождать, пока двигатель Javascirtp не выполнится на свою линию, прежде чем анализировать выражение функции сверху в нижнюю линию. 2. Выражение функции может быть немедленно вызвано с помощью скобков после выражения функции. Объявление функции не может быть сделано и может быть вызвано только в форме fnname (). Вот два примера различий между ними.
fnname (); function fnname () {...} // нормальный, потому что «продвижение» объявления функции, вызовы функций могут быть fnname (); var fnname = function () {...} // Сообщается о ошибке, переменная fnnam var fnname = function () {alert ('hello world');} (); // посылки добавляются после выражения функции. Когда здесь анализируются двигатель JavaScript, функцию можно назвать сразу функция fnname () {alert ('hello world');} (); // Там нет ошибки, но двигатель JavaScript только анализирует объявление функции, игнорирует последующие скольжения, а декларация функции не будет называется функцией () {console.ol (hello world '); } (); // Ошибка синтаксиса, хотя анонимные функции принадлежат к выражениям функций, операция назначения не выполняется, // поэтому двигатель JavaScript рассматривает ключевое слово функции в начале как объявление функции, и сообщает об ошибке: требуется имя функцииПосле понимания некоторых концепций основных функций я оглянулся на два способа написать (function () {…}) () и (function () {…} ()) немедленно. Сначала я думал, что это была анонимная функция, завернутая в кронштейн, и добавил кронштейн, чтобы немедленно вызвать функцию. В то время я не знал, почему мне пришлось добавить кронштейны. Позже я понял, что если бы мне пришлось добавить кронштейны после корпуса функции, я мог бы назвать это немедленно. Тогда эта функция должна быть выражением функции, а не объявлением функции.
(function (a) {console.log (a); // Выход Firebug 123, используйте () оператор}) (123); (function (a) {console.log (a); // Выход Firebug 1234, используйте оператор () (1234)); ! function (a) {console.log (a); // Выход Firebug 12345, используйте! Оператор} (12345); +function (a) {console.log (a); // Выход Firebug 123456, используйте + оператор} (123456); -function (a) {console.log (a); // Выход Firebug 1234567, используйте оператор - (1234567); var fn = function (a) {console.log (a); // Выход Firebug 12345678, используйте = оператор} (12345678)Вы можете увидеть выходной результат и добавить его перед функцией! , +, - и даже запятые можно использовать для выполнения сразу после определения функции, и (),! Операторы, такие как +, -, = конвертировать объявления функций в выражения функций, устраняя неоднозначность между эксплуатационными выражениями и объявлениями функции, сообщив оборота, сообщая двигателю JavaScript, что это является выражением функции, а не объявлением функции, вы можете добавить скобки после его сразу же и выполнить код функции.
Добавление кронштейнов - самый безопасный способ сделать это, потому что! Операторы, такие как, +, и - также будут выполнять операции с возвращающим значением функции, что иногда вызывает ненужные проблемы.
Но каково использование написания таким образом?
В JavaScript нет концепции частного объема. Если вы объявите некоторые переменные в глобальном или местном объеме по проекту, разработанному несколькими людьми, он может быть перезаписан другими с тем же именем. В соответствии с характеристиками цепочки объема функций JavaScript, этот метод может использоваться для имитации частного объема и использования анонимной функции в качестве «контейнера». «Контейнер» может получить доступ к внешним переменным, в то время как внешняя среда не может получить доступ к переменным внутри «контейнера», поэтому переменные, определенные внутри (function () {…}) () не будут конфликтовать с внешними переменными, обычно известными как «анонимная обертка» или «пространство имен».
JQuery использует этот метод. Когда код jQuery обернут в (функция (window, undefined) {… jQuery код…} (окно), он может защитить внутренние переменные jQuery при вызове кода jQuery в глобальном объеме.
Эта статья является личным пониманием и компиляцией. Если есть какие -либо ошибки, укажите на них. На взгляды в статье ссылаются из:
«Авторитетное руководство по JavaScript» и «расширенное программирование»