Есть смысл использовать !
для вызова функций, отмеченных в airbnb JavaScript guide
Обычно идея использовать эту технику для отдельных файлов (также называемых модулями), которые впоследствии объединяются. Предостережение заключается в том, что файлы должны объединяться инструментами, которые помещают новый файл в новую строку (что в любом случае является обычным поведением для большинства инструментов concat). В этом случае использование !
поможет избежать ошибки, если ранее объединенный модуль пропустил конечную точку с запятой, и все же это даст гибкость для размещения их в любом порядке, не беспокоясь.
!function abc(){}();
!function bca(){}();
Будет работать так же, как
!function abc(){}();
(function bca(){})();
но сохраняет два символа и произвольно выглядит лучше.
И, между прочим, любой из операторов +
, -
, ~
, void
имеет тот же эффект, с точки зрения вызова функции, наверняка, если вам нужно использовать что-то для возврата из этой функции они будут действовать по-другому.
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
но если вы используете шаблоны IIFE для одного файла с разделением кода на один модуль и используете инструмент concat для оптимизации (который выполняет одну строку на одно файловое задание), тогда конструкция
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
Будет выполнять безопасное выполнение кода, так же, как самый первый пример кода.
Этот вызовет ошибку, поскольку JavaScript ASI не сможет выполнить свою работу.
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
Одно замечание, касающееся унарных операторов, они будут выполнять аналогичную работу, но только в том случае, если они используются не в первом модуле. Поэтому они не настолько безопасны, если вы не имеете полного контроля над порядком объединения.
Это работает:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
Это не:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()