Зачем использовать оператор NOT при анонимном вызове функции? (a la Knockout 2.1.0)
Возможный дубликат:
Что делает восклицательный знак перед функцией?
Если вы посмотрите на исходный код для KnockoutJS 2.1.0, вы увидите такую структуру кода, как это начинаете в строке 7:
!function(factory) { ... }(factoryDefinition);
Не оператор заставляет это выражение оцениваться как true
, а не undefined
, но зачем беспокоиться?
Ответы
Ответ 1
Это кратчайший способ сформировать сразу выполненное выражение функции.
Традиционно люди использовали эти две формы
(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use
Если вы попытаетесь просто использовать
function(){ }(); // Syntax error
это будет синтаксическая ошибка, потому что она интерпретируется как объявление функции, а не выражение. Вот почему вам нужно обернуть функцию в круглые скобки.
Но если вы ставите унарный оператор перед объявлением функции, вам не нужно добавлять круглые скобки, и он отбивает один символ кода, что является (очень) крошечным преимуществом производительности. Существует несколько унарных операторов, которые могут использоваться для этой же цели
!function(){ }();
~function(){ }();
-function(){ }();
+function(){ }();
Ответ 2
Потому что, если вы ничего не делаете, это выглядит как синтаксическая ошибка:
function(factory) { ... }(factoryDefinition);
Попробуйте.
Необходимо, чтобы синтаксический анализатор находился в точке, где он ожидает выражение, так что ключевое слово function
распознается в этом контексте. В противном случае, когда синтаксический анализатор видит function
в качестве первого токена в инструкции, он ожидает простого объявления функции, и за ним не может следовать список аргументов в скобках.
Существуют различные альтернативы, вокруг каждого из которых кластеры различаются мнениями.