14

Что означает восклицательный знак перед функцией?

11

Я нашел следующий код:

!function () {}();

Какова цель использования восклицательного знака в данном случае?

5 ответ(ов)

24

В JavaScript синтаксисе существует объявление функции, например:

function foo() {}

Обратите внимание, что здесь нет точки с запятой; это просто объявление функции. Чтобы фактически вызвать эту функцию, требуется использование вызова: foo().

Теперь, когда мы добавляем кажущийся безобидным восклицательный знак: !function foo() {}, это преобразует его в выражение. Теперь это выражение функции.

Сам по себе ! не вызывает функцию, но мы можем добавить () в конце: !function foo() {}(), что увеличивает приоритет вызова функции и выполняет ее мгновенно.

Запись function foo() {}() вызовет ошибку синтаксиса, так как вы не можете добавлять аргументы (()) сразу после объявления функции.

Таким образом, то, что делает автор, это экономит один байт на каждое выражение функции; более читабельный способ записи этого выглядел бы так:

(function() {})();

Кроме того, ! заставляет выражение возвращать логическое значение на основе возвращаемого значения функции. Обычно IIFE (немедленно вызываемое функциональное выражение) ничего явно не возвращает, поэтому его возвращаемое значение будет undefined, что приводит к !undefined, что равно true. Это логическое значение не используется.

4

Функция:

function () {}

не возвращает ничего (или возвращает undefined).

Иногда мы хотим вызвать функцию сразу после её создания. Вы можете попробовать сделать это следующим образом:

function () {}()

Однако это приведёт к ошибке SyntaxError.

Использование оператора ! перед функцией заставляет JavaScript рассматривать её как выражение, поэтому мы можем вызвать её:

!function () {}()

Тем не менее, это также вернёт логическое противоположное значение возвращаемому значению функции, в данном случае это будет true, потому что !undefined равно true. Если вы хотите, чтобы фактическое возвращаемое значение функции стало результатом вызова, попробуйте сделать это так:

(function () {})()
0

Функция ! возвращает информацию о том, может ли выражение оцениваться как false. Например:

!false      // true
!true       // false
!isValid()  // не является допустимым

Вы можете использовать двойное отрицание, чтобы привести значение к булевому типу:

!!1    // true
!!0    // false

Таким образом, чтобы более прямо ответить на ваш вопрос:

var myVar = !function(){ return false; }();  // myVar содержит true

Правка: Это имеет побочный эффект, так как объявление функции становится функцией-выражением. Например, следующий код является неверным, поскольку он интерпретируется как объявление функции, у которой отсутствует обязательный идентификатор (или имя функции):

function () { return false; }();  // синтаксическая ошибка
0

Знак восклицания (!) в 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

Таким образом, этот подход позволяет избежать ошибок синтаксиса и работает корректно, возвращая нужное булевое значение.

0

Это другой способ записи IIFE (немедленно вызываемое функциональное выражение).

Вот так можно записать IIFE:

(function(args) {})();

Это то же самое, что и:

!function(args) {}();

Обе записи создают и сразу вызывают анонимную функцию. Использование оператора ! перед функцией – это лишь один из способов обеспечить корректное синтаксическое оформление, чтобы функция была вызвана немедленно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь