Будь-яка різниця між f () і (f ())?

Будь-яка різниця між

var myfunc = (function() { return function() { ... } }());

і

var myfunc = function() { return function() { ... } }();

Чи це просто стиль, чи існує ще більше оточення() у першій формі?

6
Трохи пов'язані (Крокфорд говорить про позиціювання дужок): youtube.com/watch?v=eGArABpLy0k
додано Автор Felix Kling, джерело
Очевидно, у нас є більше дужок.
додано Автор Ryan Kempt, джерело

7 Відповіді

Ні. Або принаймні не у вашому прикладі.

Зовнішні паренси мають значення лише тоді, коли ключове слово функції буде першим жетоном у твердженні.

// cool
var foo = function(){}();
var foo = (function(){}());

// also cool
(function(){}());

// not cool, syntax error
// parsed as function statement, expects function name which is missing
function(){}();

// also not cool, syntax error
// declares a function, but can't be executed immediately
function foo(){}();

Якщо функція є першим токенем в твердженні, це декларація функції (думаю, названа функція), яка поводить себе дещо інакше, ніж function у всіх інших контексти. Це провідні сили paren обробляє його як вираження функції (думаю, анонімний ) замість нього, що дозволяє негайно виконати.

See: What is the difference between a function expression vs declaration in JavaScript?

Якщо ви запускаєте лінію або виписку з чимось іншим, як і декларація змінного, це технічно взагалі не має значення.

6
додано
@FelixKling досить близько. Тут дуже багато глибини і тонкості. Моя відповідь не вивчає все це. Я просто мав на увазі, що вирази fn ближчі до "анонімного" характеру, ніж декларації fn. Збережемо пояснення різниці між названими та неназваними виразами функцій для іншого запитання.
додано Автор Alex Wayne, джерело
Ви не кажете, що кожне вираження функції є анонімною функцією, чи є ви?
додано Автор Felix Kling, джерело
Я можу жити з цим;)
додано Автор Felix Kling, джерело
@FelixKling - Яка частина того, чому Бен Альман так одержимий, що називає їх IIFE s.
додано Автор Joseph Silber, джерело

Немає ніякої різниці, хоча Крокфорд радить використовувати перший, щоб переконатися, що це розглядається як вираз функції.

Щоб отримати додаткову інформацію, прочитайте ці:

1
додано
Дякую! Саме там, де я бачив це, він використовувався в його JavaScript: книга "Гарні частини". Я думав, що я щось не вистачає. Я здогадуюсь, що це більш читабельна, ви не можете швидко припустити, що функція "1" призначена для змінної.
додано Автор user2526241, джерело

Там немає технічної різниці, це просто ідіоматичний стиль, який використовується для читання, щоб сигналізувати на початку, що це функція самонаведення.

0
додано

Там немає технічної різниці, це просто ідіоматичний стиль, який використовується для читання, щоб сигналізувати на початку, що це функція самонаведення.

0
додано

no difference, it is just a matter of style. Both are executed functions and they return whatever they return in the variable and they are returning a function. check this out

0
додано

мета полягає у тому, щоб уникнути глобального масштабу, додаючи var myfunc = перед функцією (function() {return function() {}} ()); суттєво побиває мета

порівняйте два

(function(){...do something...}());

ця функція виконується в локальній області, яка знаходиться в круглих дужках.

var myfunc = function(){};

ця функція використовується у глобальному масштабі. чому б не це, тому що ви можете самостійно називати конфлікти з іншими методами, а var , а також плагін називається var , і це може перешкодити вашій програмі роботи з var зберігається в глобальному масштабі.

Я perfer

(function() {})();
0
додано
"ця функція виконується в локальній області, яка знаходиться в круглих дужках". Я думаю, ви тут заплутаєте деякі речі. Патентіз не створюють сферу, виконують лише функції. Безпосередньо викликані вирази функцій (IIFE) використовуються для створення локального простору та "сховати" змінні з області дії, в якій виконується функція. Але обидва твердження: (function() {... робити щось ...} ()) ; і var myfunc = function() {}; можна вважати, що вони працюють у тій самій області. Або я неправильно розумію вашу відповідь.
додано Автор Felix Kling, джерело
Це звучить більш правильно, ніж те, що написано у відповідь. Хоча ви не можете ініціалізувати змінні всередині (); . У дужках повернення значення, або ви збережете його в змінній чи ні.
додано Автор Felix Kling, джерело
Ну, будь-яка змінна, ініціалізована всередині (); , запускається, а потім видаляється gc, якщо var , тобто var myfunc оголошується поза межами () воно виконується і зберігається в глобальному масштабі. ваше право вони обидва працюють у глобальному масштабі, різниця в тому, що зберігається після запуску, а інший - за допомогою gc
додано Автор Jay Harris, джерело

мета полягає у тому, щоб уникнути глобального масштабу, додаючи var myfunc = перед функцією (function() {return function() {}} ()); суттєво побиває мета

порівняйте два

(function(){...do something...}());

ця функція виконується в локальній області, яка знаходиться в круглих дужках.

var myfunc = function(){};

ця функція використовується у глобальному масштабі. чому б не це, тому що ви можете самостійно називати конфлікти з іншими методами, а var , а також плагін називається var , і це може перешкодити вашій програмі роботи з var зберігається в глобальному масштабі.

Я perfer

(function() {})();
0
додано
"ця функція виконується в локальній області, яка знаходиться в круглих дужках". Я думаю, ви тут заплутаєте деякі речі. Патентіз не створюють сферу, виконують лише функції. Безпосередньо викликані вирази функцій (IIFE) використовуються для створення локального простору та "сховати" змінні з області дії, в якій виконується функція. Але обидва твердження: (function() {... робити щось ...} ()) ; і var myfunc = function() {}; можна вважати, що вони працюють у тій самій області. Або я неправильно розумію вашу відповідь.
додано Автор Felix Kling, джерело
Це звучить більш правильно, ніж те, що написано у відповідь. Хоча ви не можете ініціалізувати змінні всередині (); . У дужках повернення значення, або ви збережете його в змінній чи ні.
додано Автор Felix Kling, джерело
Ну, будь-яка змінна, ініціалізована всередині (); , запускається, а потім видаляється gc, якщо var , тобто var myfunc оголошується поза межами () воно виконується і зберігається в глобальному масштабі. ваше право вони обидва працюють у глобальному масштабі, різниця в тому, що зберігається після запуску, а інший - за допомогою gc
додано Автор Jay Harris, джерело
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram