2015-07-08 1 views
15

Я читаю эту книгу, и она имеет следующий пример кодаПочему в этом анонимном вызове функции отсутствует скобка?

function getFunction() { 
    var result = []; 
    for (var i = 0; i < 10; i++) { 
     result[i] = function(num) { 
      return function() { 
       console.log("this is " + num); 
      } 
     }(i); 
    }; 

    return result; 
} 

Он работает нормально, но почему анонимная функция здесь не обернута в круглых скобках как этот (function(...))(i);? И в каких случаях круглые скобки могут быть опущены в анонимной функции?

+0

Обратите внимание, что существуют другие способы заставить функцию быть выражением. Например: '! Function() {}()' или '0/function() {}()' или моя любимая '-функция() {}()' – slebetman

+0

Также см. [Почему скобки необходимы] (http : //stackoverflow.com/q/1634268/1048572) в других местах. – Bergi

ответ

17

Поскольку синтаксис деклараций функций и выражений функций идентичен, JS сообщает, какой из них вы используете из кода вокруг функции.

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

8

Поскольку он используется как второй операнд для оператора присваивания = JS-движок может с уверенностью относиться к нему как к выражению функции.

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

2

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

var a=1; 
(function(b){ 
    a=b; 
})(2); 
console.log(a); 

, который выводит 2.

Везде выражение, как ожидается, эквивалентны следующие

function(a){....}(b);

(function(a){....})(b);

(function(a){....}(b));

Скобки, однако, считаются наилучшей практикой, потому что они «намекают» на то, что она является сразу вызываемой функцией, не прокручивая ее до конца.

4

Обычная функция объявления выглядит следующим образом:

function FuncName() { doSomething(); } 

Тогда вы можете вызвать эту функцию следующим образом:

FuncName(); 

Анонимные функции очень похожи:

var FuncName = function YouCanEvenPutANameHereAndItWillBeIgnored() { doSomething(); } 

Если синтаксис для регулярных функций и анонимных функций одинаково, тогда как JS их отличает? Он выводит то, что вы подразумеваете под контекстом. Вот почему это мгновенно Вызывается функция Expression не будет работать:

function(s) { console.log(s); } ('abc'); 

JS парсер читает слева.Строка начинается с function, поэтому JS догадывается, что это регулярное объявление функции и ожидает, что оно закончится }. Есть ('abc') после функции, хотя, и JS выдает ошибку.

Чтобы исправить это, вы должны обмануть JS для разбора этой функции как анонимной функции. Для этого вам нужно сделать это частью выражения. Самый популярный способ заключается в следующем:

(function(s) { console.log(s); }) ('abc'); 

Есть и другие способы. Они менее читаемы, но они тоже работают.

(function(s) { console.log(s); } ('abc')); 
+function(s) { console.log(s); } ('abc'); 
-function(s) { console.log(s); } ('abc'); 
1 * function(s) { console.log(s); } ('abc'); 

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

+1

Причина, по которой строка, начинающаяся с 'function', является ошибкой синтаксического анализа, состоит в том, что функция не имеет имени. 'function log (s) {console.log (s); } (function (s) {console.log (s);} ('abc')) 'объявляет функцию' log', а затем записывает 'abc'. Однако оберните его в скобки, и он выполняется вместо объявления. Также '!' Часто используется для анализа кода как выражения, он хорошо взаимодействует с автоматической точкой с запятой. – Neil