Способы выполнения Javascript Self Invoking Functions [duplicate]

Ваш процессор не работает с отдельными битами, но с байтами и словами. В вашем случае sizeof (bits) приводит к 4, потому что компилятор решил выровнять эту структуру данных с 4 байтами.

98
задан Community 23 May 2017 в 10:31
поделиться

4 ответа

Они практически одинаковы.

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

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

Я не думаю, что есть «правильный» способ сделать это, так как результат выражения тот же.

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
60
ответ дан meder omuraliev 17 August 2018 в 10:50
поделиться
  • 1
    JSLint хочет & quot; (function () {} ()); & quot ;. JSLint говорит: «Переместите вызов в парны, содержащие эту функцию». – XP1 18 July 2011 в 12:05
  • 2
    На самом деле вы не ограничены этими двумя, вы можете использовать практически все, что делает компилятор понятием, что функция является частью выражения, а не оператора, такого как +function(){}() или !function(){}(). – Tgr 25 July 2011 в 23:49
  • 3
    @ XP1: JSLint хочет много вещей, характерных для стиля Крокфорда, а не существительного. Это одна из них. – T.J. Crowder 28 July 2011 в 09:43
  • 4
    @ T.J.Crowder. Чтобы вы посоветовали? jQuery использует первый стиль, а Crockford использует второй. – Thorpe Obazee 16 February 2012 в 09:55
  • 5
    @ThorpeObazee: Это действительно не имеет значения, так что делайте то, что вы предпочитаете. Я бы рекомендовал против некоторых из более outre (-function(){}();, !function(){}();, и в основном любой другой оператор непосредственно перед function также работал, но я придерживался версий с использованием parens). Я вижу первую a lot больше, чем вторую, и это мое предпочтение; это имеет смысл и для меня, но это субъективно. FWIW: jsbin.com/ejaqow – T.J. Crowder 16 February 2012 в 10:38

Разница существует только потому, что Дугласу Крокфорду не нравится первый стиль для IIFEs ! (seriuosly) Как вы можете видеть в этом видео !! .

Единственная причина существования дополнительной обертки () {в обоих стилях} заключается в том, чтобы помочь сделать это раздел кода Функция Expression , потому что Функция Объявление не может быть немедленно вызвана. Некоторые скрипты / минифигуры просто используют +, !, - и amp; ~ вместо слишком круглых скобок. Например:

+function() {  
    var foo = 'bar';  
}();

!function() {  
    var foo = 'bar';  
}();

-function() {  
    var foo = 'bar';  
}();

~function() {  
    var foo = 'bar';  
}();

И все это точно так же, как и ваши альтернативы. Выбор среди этих случаев полностью зависит от вас; не имеет значения. {Те, у кого есть (), производят 1 байт более крупный файл ;-)}

-3
ответ дан Behrad Khodayar 17 August 2018 в 10:50
поделиться

Не существует никакой разницы за пределами синтаксиса.

Что касается ваших опасений по поводу второго метода его выполнения:

Рассмотрим:

(function namedfunc () { ... }())

namedfunc все равно не будет в глобальном масштабе, даже если вы указали имя. То же самое касается анонимных функций. Единственный способ получить его в этой области - назначить ему переменную внутри парнеров.

((namedfunc = function namedfunc () { ... })())

Внешние парсеры не нужны:

(namedfunc = function namedfunc () { ... })()

Но вы не сделали

Так оно и сводится к:

(function namedfunc () { ... })()

И вы можете уменьшить его еще больше: имя не нужно, поскольку оно будет никогда не используется (если ваша функция не рекурсивна .. и даже тогда вы могли бы использовать arguments.callee)

(function () { ... })()

Так я думаю об этом (может быть неверно, я не читал ECMAScript спецификация все же). Надеюсь, что это поможет.

7
ответ дан Henning Makholm 17 August 2018 в 10:50
поделиться

В этом случае это не имеет значения. Вы вызываете выражение, которое разрешает функцию в первом определении и определяет и сразу вызывает функцию во втором примере. Они похожи, потому что выражение функции в первом примере - это просто определение функции.

Существуют и другие, более очевидные, полезные случаи для вызова выражений, которые разрешают функции:

(foo || bar)()
13
ответ дан Triptych 17 August 2018 в 10:50
поделиться
  • 1
    Для разъяснения другим читателям (в основном потому, что я сам не понял это сначала :)), foo и / или bar должны уже соответствовать некоторой функции. (например, foo = function(){alert('hi');}. Если ни одна из них не является функцией, возникает ошибка. – Alexander Bird 12 April 2012 в 19:53
  • 2
    @AlexanderBird Дальнейшее уточнение - оно также выдаст ошибку, если foo является "правдивым" но не функция. – JLRishe 21 August 2014 в 06:40
Другие вопросы по тегам:

Похожие вопросы: