Ваш процессор не работает с отдельными битами, но с байтами и словами. В вашем случае sizeof (bits) приводит к 4, потому что компилятор решил выровнять эту структуру данных с 4 байтами.
Они практически одинаковы.
Первый раунд скобок вокруг функции, чтобы сделать его действительным выражением и вызывает его. Результат выражения не определен.
Второй выполняет функцию, а круглые скобки вокруг автоматического вызова делают это допустимым выражением. Он также оценивает неопределенные.
Я не думаю, что есть «правильный» способ сделать это, так как результат выражения тот же.
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
Разница существует только потому, что Дугласу Крокфорду не нравится первый стиль для IIFEs ! (seriuosly) Как вы можете видеть в этом видео !! .
Единственная причина существования дополнительной обертки ()
{в обоих стилях} заключается в том, чтобы помочь сделать это раздел кода Функция Expression , потому что Функция Объявление не может быть немедленно вызвана. Некоторые скрипты / минифигуры просто используют +
, !
, -
и amp; ~
вместо слишком круглых скобок. Например:
+function() {
var foo = 'bar';
}();
!function() {
var foo = 'bar';
}();
-function() {
var foo = 'bar';
}();
~function() {
var foo = 'bar';
}();
И все это точно так же, как и ваши альтернативы. Выбор среди этих случаев полностью зависит от вас; не имеет значения. {Те, у кого есть ()
, производят 1 байт более крупный файл ;-)}
Не существует никакой разницы за пределами синтаксиса.
Что касается ваших опасений по поводу второго метода его выполнения:
Рассмотрим:
(function namedfunc () { ... }())
namedfunc
все равно не будет в глобальном масштабе, даже если вы указали имя. То же самое касается анонимных функций. Единственный способ получить его в этой области - назначить ему переменную внутри парнеров.
((namedfunc = function namedfunc () { ... })())
Внешние парсеры не нужны:
(namedfunc = function namedfunc () { ... })()
Но вы не сделали
Так оно и сводится к:
(function namedfunc () { ... })()
И вы можете уменьшить его еще больше: имя не нужно, поскольку оно будет никогда не используется (если ваша функция не рекурсивна .. и даже тогда вы могли бы использовать arguments.callee
)
(function () { ... })()
Так я думаю об этом (может быть неверно, я не читал ECMAScript спецификация все же). Надеюсь, что это поможет.
В этом случае это не имеет значения. Вы вызываете выражение, которое разрешает функцию в первом определении и определяет и сразу вызывает функцию во втором примере. Они похожи, потому что выражение функции в первом примере - это просто определение функции.
Существуют и другие, более очевидные, полезные случаи для вызова выражений, которые разрешают функции:
(foo || bar)()
foo = function(){alert('hi');}
. Если ни одна из них не является функцией, возникает ошибка.
– Alexander Bird
12 April 2012 в 19:53
foo
является "правдивым" но не функция.
– JLRishe
21 August 2014 в 06:40
+function(){}()
или!function(){}()
. – Tgr 25 July 2011 в 23:49-function(){}();
,!function(){}();
, и в основном любой другой оператор непосредственно передfunction
также работал, но я придерживался версий с использованием parens). Я вижу первую a lot i> больше, чем вторую, и это мое предпочтение; это имеет смысл и для меня, но это субъективно. FWIW: jsbin.com/ejaqow – T.J. Crowder 16 February 2012 в 10:38