JavaScript

Зачем функции оборачивают в скобки?

Зачем всё это обернуто в круглые скобки в самом начале перед function() и в конце перед ();

(function() {

function myfunc1() { ...code... }

function myfunc2() { ...code... }

function myfunc3() { ...code... }

})();
язык ЯВА
Сергей Давлятов
Сергей Давлятов
3 893
Лучший ответ
Чтобы эту функцию можно было тут же выполнить:
function(){...}(); - синтаксическая ошибка
(function(){...})(); - функция сразу же выполняется
Николай Анисимов это находится между тегами script в html-коде, но зачем так делать если можно так:

function myfunc1() { ...code... }

function myfunc2() { ...code... }

function myfunc3() { ...code... }

myfunc1();

я сейчас кстати глянул по внимательнее, там конструкция вот такая:

(function() {

function myfunc1() { ...code... }

function myfunc2() { ...code... }

function myfunc3() { ...code... }

myfunc1();

})();

но все равно, зачем эта оболочка?
Если функцию обернуть в скобки - получится самозапускающаяся функция. В JS это применяется для создания пространства имен
Затем что это IIFE.
Его назначение вполне очевидно, как и назначение скобок.

// В четырех скобках разобраться - это, конечно, сложнааа... Категория скоро докатится до вопросов вида «зочем включяют кампьютор перид тем как с ним роботать?»
Если созданную функцию нужно вызвать только в одном месте, один раз... Вместо

tmp();
function tmp() {
  /* ...*/
}

Можно сразу без названия:

(function () {
  /* ...*/
})();

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

Другой момент: Функция создает локальное окружение. Если нужно гарантировать, что созданные в коде переменные не будут конфликтовать с другими, можно прямо так и писать:

(function _closure() { // кто-то любит название 'namespace'
  /* ...*/
})();
__________

А сама обертка скобками... нужна, потому что объявленную функцию (function declaration) нельзя сразу вызвать, будет синтаксическая ошибка... function () {}();

А функциональные выражения - можно:

let x = function () {
  console.log('test');
}();

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

Когда парсер встречает функцию внутри скобок, он считает её функциональным выражением, а не объявлением. В некоторых кодах можно встречать и такое:

~function () {
  console.log('test');
}();

!function () {
  console.log('test');
}();

+function () {
  console.log('test');
}();

Операторы также превращают это в выражение, но у скобок вызова функции () приоритет выше, сначала вызывается функция, а потом уже происходит ненужные операции ~!+-
Николай Анисимов зачем это кстати ?
~ ! +
Погугли immediately invoked function
Roma Azimov
Roma Azimov
997
потому что эта скрытая функция, её обычно применяют, потому что нужна кокая-то функция, и чтобы не объявлять на новой строке и именами, просто запиливают уже к какому то свойству или переменной или объекту, ну крч к чему угодно. Если ее применяют то обычно она срабатывает 1 раз и всё. Вещь нужная.
Это язык. Кто его придумал так и придумал. Я сам толком не знаю. Только разрабы знают его или разработчик его не знаю.