Что означает восклицательный знак перед функцией?
Я нашел следующий код:
!function () {}();
Какова цель использования восклицательного знака в данном случае?
5 ответ(ов)
В JavaScript синтаксисе существует объявление функции, например:
function foo() {}
Обратите внимание, что здесь нет точки с запятой; это просто объявление функции. Чтобы фактически вызвать эту функцию, требуется использование вызова: foo()
.
Теперь, когда мы добавляем кажущийся безобидным восклицательный знак: !function foo() {}
, это преобразует его в выражение. Теперь это выражение функции.
Сам по себе !
не вызывает функцию, но мы можем добавить ()
в конце: !function foo() {}()
, что увеличивает приоритет вызова функции и выполняет ее мгновенно.
Запись function foo() {}()
вызовет ошибку синтаксиса, так как вы не можете добавлять аргументы (()
) сразу после объявления функции.
Таким образом, то, что делает автор, это экономит один байт на каждое выражение функции; более читабельный способ записи этого выглядел бы так:
(function() {})();
Кроме того, !
заставляет выражение возвращать логическое значение на основе возвращаемого значения функции. Обычно IIFE (немедленно вызываемое функциональное выражение) ничего явно не возвращает, поэтому его возвращаемое значение будет undefined
, что приводит к !undefined
, что равно true
. Это логическое значение не используется.
Функция:
function () {}
не возвращает ничего (или возвращает undefined
).
Иногда мы хотим вызвать функцию сразу после её создания. Вы можете попробовать сделать это следующим образом:
function () {}()
Однако это приведёт к ошибке SyntaxError
.
Использование оператора !
перед функцией заставляет JavaScript рассматривать её как выражение, поэтому мы можем вызвать её:
!function () {}()
Тем не менее, это также вернёт логическое противоположное значение возвращаемому значению функции, в данном случае это будет true
, потому что !undefined
равно true
. Если вы хотите, чтобы фактическое возвращаемое значение функции стало результатом вызова, попробуйте сделать это так:
(function () {})()
Функция !
возвращает информацию о том, может ли выражение оцениваться как false
. Например:
!false // true
!true // false
!isValid() // не является допустимым
Вы можете использовать двойное отрицание, чтобы привести значение к булевому типу:
!!1 // true
!!0 // false
Таким образом, чтобы более прямо ответить на ваш вопрос:
var myVar = !function(){ return false; }(); // myVar содержит true
Правка: Это имеет побочный эффект, так как объявление функции становится функцией-выражением. Например, следующий код является неверным, поскольку он интерпретируется как объявление функции, у которой отсутствует обязательный идентификатор (или имя функции):
function () { return false; }(); // синтаксическая ошибка
Знак восклицания (!
) в JavaScript используется для получения логического отрицания значения, и при его использовании перед вызовом функции, эта функция всегда будет возвращать булевое значение.
Вот примеры:
!function bool() { return false; }() // true
!function bool() { return true; }() // false
В данном случае, !
инвертирует возвращаемое функцией значение. Если функция возвращает false
, то результат будет true
, и наоборот.
Если попробовать вызвать функцию без !
, как показано ниже:
function bool() { return true; }() // SyntaxError
Это приведет к SyntaxError, потому что JavaScript ожидает либо присвоения функции переменной, либо её вызова.
Лучший способ вызвать функцию и получить её возвращаемое значение — это обернуть её в круглые скобки:
(function bool() { return true; })() // true
Таким образом, этот подход позволяет избежать ошибок синтаксиса и работает корректно, возвращая нужное булевое значение.
Это другой способ записи IIFE (немедленно вызываемое функциональное выражение).
Вот так можно записать IIFE:
(function(args) {})();
Это то же самое, что и:
!function(args) {}();
Обе записи создают и сразу вызывают анонимную функцию. Использование оператора !
перед функцией – это лишь один из способов обеспечить корректное синтаксическое оформление, чтобы функция была вызвана немедленно.
Сравнение: var functionName = function() {} против function functionName() {}
Установка значения по умолчанию для параметра функции в JavaScript
В чем разница между call и apply?
Проверка существования переменной в JavaScript (определена/инициализирована)
JavaScript: Знак плюс перед функциональным выражением