Подтвердить что ты не робот

Зачем использовать оператор NOT при анонимном вызове функции? (a la Knockout 2.1.0)

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

Если вы посмотрите на исходный код для KnockoutJS 2.1.0, вы увидите такую ​​структуру кода, как это начинаете в строке 7:

!function(factory) { ... }(factoryDefinition);

Не оператор заставляет это выражение оцениваться как true, а не undefined, но зачем беспокоиться?

4b9b3361

Ответ 1

Это кратчайший способ сформировать сразу выполненное выражение функции.

Традиционно люди использовали эти две формы

(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use

Если вы попытаетесь просто использовать

function(){ }(); // Syntax error

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

Но если вы ставите унарный оператор перед объявлением функции, вам не нужно добавлять круглые скобки, и он отбивает один символ кода, что является (очень) крошечным преимуществом производительности. Существует несколько унарных операторов, которые могут использоваться для этой же цели

!function(){ }();
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 

Ответ 2

Потому что, если вы ничего не делаете, это выглядит как синтаксическая ошибка:

function(factory) { ... }(factoryDefinition);

Попробуйте.

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

Существуют различные альтернативы, вокруг каждого из которых кластеры различаются мнениями.