Недавно я сравнивал текущую версию json2.js с версией, которая была в моем проекте, и заметил разницу в том, как выражение функции создавалось и выполнялось самостоятельно.
Код, используемый для заключения анонимной функции в круглые скобки и последующего ее выполнения,
(function () {
// code here
})();
но теперь автоматически выполняемая функция заключена в круглые скобки.
(function () {
// code here
}());
В принятом ответе на синтаксис инкапсулированной анонимной функции Explain JavaScript есть комментарий CMS, который «оба: (function(){})();
и (function(){}());
действительны».
Интересно, в чем разница? Занимает ли первое память, оставляя глобальную анонимную функцию? Где должна быть скобка?
javascript
syntax
anonymous-function
iife
Кевин Хакансон
источник
источник
Ответы:
Они практически такие же.
Первый оборачивает функцию в круглые скобки, чтобы сделать ее допустимым выражением, и вызывает ее. Результат выражения не определен.
Второй выполняет функцию, и круглые скобки вокруг автоматического вызова делают его допустимым выражением. Он также оценивается как undefined.
Я не думаю, что есть «правильный» способ сделать это, поскольку результат выражения тот же.
источник
+function(){}()
или!function(){}()
.-function(){}();
,!function(){}();
и, в основном, любой другой оператор, который был перед этим,function
также работал, но я бы придерживался версий с использованием скобок). Я вижу первое намного больше, чем второе, и это мое предпочтение; для меня это тоже имеет больше смысла, но это субъективно. FWIW: jsbin.com/ejaqowВ таком случае это не имеет значения. Вы вызываете выражение, которое преобразуется в функцию в первом определении, а определяете и немедленно вызываете функцию во втором примере. Они похожи, потому что выражение функции в первом примере - это просто определение функции.
Есть и другие, более очевидные полезные случаи для вызова выражений, которые разрешаются в функции:
источник
foo = function(){alert('hi');}
если ни одна из функций не является функцией, выдается ошибка.foo
он "правдив", но не является функцией.Нет никакой разницы, кроме синтаксиса.
Что касается вашего беспокойства по поводу второго способа сделать это:
Рассматривать:
(function namedfunc () { ... }())
namedfunc
по-прежнему не будет в глобальной области, даже если вы указали имя. То же самое и с анонимными функциями. Единственный способ получить его в этой области - назначить его переменной внутри скобок.Внешние скобки не нужны:
Но вы все равно не хотели этого глобального заявления, не так ли?
Итак, это сводится к:
И вы можете уменьшить его еще больше: имя не нужно, поскольку оно никогда не будет использоваться (если ваша функция не является рекурсивной ... и даже тогда вы можете использовать
arguments.callee
)Я так думаю об этом (может быть, неправильно, я еще не читал спецификацию ECMAScript). Надеюсь, поможет.
источник
arguments.callee
это устарело с ES5 (и запрещено в строгом режиме).Разница просто существует потому, что Дугласу Крокфорду не нравится первый стиль для IIFE ! (серьезно) Как видно на этом видео !!.
Единственная причина существования дополнительной обертки
()
{в обоих стилях} состоит в том, чтобы помочь сделать этот раздел кода Выражением функции , поскольку объявление функции не может быть вызвано немедленно. Некоторые скрипты / преуменьшать-ERS просто использовать+
,!
,-
и~
вместо того, чтобы слишком круглые скобки. Как это:И все это точно так же, как ваши альтернативы. Выбирать среди этих случаев вы делаете самостоятельно и не имеет значения. {Те , с
()
продукцией 1 байт большего файла ;-)}источник