Зачем всё это обернуто в круглые скобки в самом начале перед function() и в конце перед ();
(function() {
function myfunc1() { ...code... }
function myfunc2() { ...code... }
function myfunc3() { ...code... }
})();
JavaScript
Зачем функции оборачивают в скобки?
язык ЯВА
Чтобы эту функцию можно было тут же выполнить:
function(){...}(); - синтаксическая ошибка
(function(){...})(); - функция сразу же выполняется
function(){...}(); - синтаксическая ошибка
(function(){...})(); - функция сразу же выполняется
Если функцию обернуть в скобки - получится самозапускающаяся функция. В 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');
}();
Операторы также превращают это в выражение, но у скобок вызова функции () приоритет выше, сначала вызывается функция, а потом уже происходит ненужные операции ~!+-
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
потому что эта скрытая функция, её обычно применяют, потому что нужна кокая-то функция, и чтобы не объявлять на новой строке и именами, просто запиливают уже к какому то свойству или переменной или объекту, ну крч к чему угодно. Если ее применяют то обычно она срабатывает 1 раз и всё. Вещь нужная.
Это язык. Кто его придумал так и придумал. Я сам толком не знаю. Только разрабы знают его или разработчик его не знаю.
Похожие вопросы
- Калькулятор из функций
- Вопрос по JavaScript, обращение к функции, которая находится в функции...
- Почему функция постоянно возвращает true или false? (но не должна)
- Проверка вызывалась ли функция (подробности внутри)
- Как в данном случае лучше заменить стрелочную функцию на обычную?
- Помогите доделать задачу используя функции
- Зачем разработчики js сделали так что там где могли быть функции они добавили методы встроенных объектов.
- Почему так работают функции?
- Как сделать что бы 2 функции выполнялись поочередно.JS
- Объясните мне, пожалуйста, что это за аргументы функции в javascript ( function(arg1, arg2, ..) ).
function myfunc1() { ...code... }
function myfunc2() { ...code... }
function myfunc3() { ...code... }
myfunc1();
я сейчас кстати глянул по внимательнее, там конструкция вот такая:
(function() {
function myfunc1() { ...code... }
function myfunc2() { ...code... }
function myfunc3() { ...code... }
myfunc1();
})();
но все равно, зачем эта оболочка?