Функция анонимного JavaScript для глобального сокращения - PullRequest
4 голосов
/ 01 ноября 2010

Я столкнулся с какой-то странностью в синтаксисе JavaScript, которую я не понимаю.

Я пытался использовать одну анонимную глобальную функцию для глобального сокращения, например:

<script type="text/javascript">
  function() {
    alert("all code goes here");
  }();
</script>

К сожалению, я получаю синтаксическую ошибку. Это исправляет это:

<script type="text/javascript">
  var MAIN = function() {
    alert("all code goes here");
  }();
</script>

Но это неудовлетворительно, потому что теперь существует глобальный MAIN объект. Затем я наткнулся на это:

<script type="text/javascript">
  (function() {
    alert("all code goes here");
  })();
</script>

Мой коллега увидел это, покачал головой и сказал: "Это какой-то синтаксис".

Что происходит с

var x = function() { .. }();

, для которого требуется скобка без такой переменной

(function() { ... })();

Редактировать: идентичен другому вопросу, с этим великим ответом .

Ответы [ 4 ]

3 голосов
/ 01 ноября 2010

Проблема в том, что function() {}() анализируется как объявление функции .В объявлении функции имя функции является обязательным, поэтому, поскольку оно здесь отсутствует, вы получаете синтаксическую ошибку.Размещение скобок вокруг function() {}() устраняет проблему, заставляя код внутри анализироваться вместо выражения: скобки действуют как оператор группировки , в пределах которого допустимо только выражение.* Размещение function() {}() справа от присвоения работает по той же причине: здесь допустимо только выражение, поэтому функция анализируется как выражение.

Это краткое объяснение.Если вам нужна более длинная версия, я бы предложил прочитать отличное объяснение CMS в другом вопросе .

1 голос
/ 09 июля 2013

Таким образом, причина в основном состоит в том, чтобы устранить неоднозначность между объявлением функции и выражением функции.

Если дополнительные скобки или введение переменной не устраивают вас, всегда найдется оператор, которого вы можете убедить сделатьработа для вас:

void function() {
    alert('hi');
}();
1 голос
/ 01 ноября 2010

В основном ... Javascript требует, чтобы вы поместили свою функцию куда-нибудь.

Вы можете сделать это с обычным именованным синтаксисом:

function foo(){}

Или с синтаксисом присваивания переменной:

var foo = function(){}

Синтаксис с () фактически является вторым синтаксисом, но вы выбрасываете результат вместо того, чтобы где-то его хранить.

Это фактически эквивалентно приведенному выше утверждению:

var foo = (function(){})

Но поскольку вы не можете иметь назначение без назначения чего-либо, оно не будет работать без ().

0 голосов
/ 01 ноября 2010
<script>
var foo = function(){alert("call");}();
var foo2 = function(){alert("call");};
console.log(foo2);
console.log(foo);

//foo(); //<-bad, foo not a function
console.log(function(){return "json";}());
</script>

var foo не определено, потому что нет возвращаемого значения; если мы сделаем это:

var foo = function(){return function(){alert("call");};}();
foo(); //works cause a function is assigned to foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...