Как прочитать синтаксис закрытия Javascript? - PullRequest
5 голосов
/ 14 июля 2011

На основе некоторого кода в лекции Дуга Крокфорда, я создал это.

var isAlphaUser = (function() {
    alert("Forming Alpha User List");
    let AlphaUsers = {
        1234: true,
        5678: true
    };

    return function(id){
        alert("Checking Alpha Users:",id); 
        return AlphaUsers[id];};
}());

alert("starting");
alert(isAlphaUser(1234));
alert(isAlphaUser(5678));
alert(isAlphaUser(3456));

, что дает мне это:

Forming Alpha User List
starting
Checking Alpha Users: 1234
true
Checking Alpha Users: 5678
true
Checking Alpha Users: 3456
undefined

Что довольно круто, так каквыполняет дорогостоящую настройку только один раз, и каждый последующий вызов является дешевой проверкой.

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

Может кто-нибудь объяснить, как работает этот синтаксис?

Ответы [ 4 ]

13 голосов
/ 14 июля 2011

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

Шаблон function() { ... }() часто используется для изоляции переменных во внутренней области, поэтому эти переменные не становятся частью глобальной области.

В данном случае так происходит:

  1. Запускается анонимная функция, определяющая переменную AlphaUsers внутри этой области.
  2. Эта функция возвращает другую функцию, которая принимает 1 параметр. Эта функция является замыканием, к которому привязывается переменная AlphaUsers (другими словами, доступна). Эта функция проверяет, содержится ли переданный параметр в AlphaUsers (на самом деле, он возвращает элемент с этим индексом, который является просто логическим значением).
  3. Возвращаемое значение присваивается переменной isAlphaUser.
  4. Поскольку isAlphaUser теперь является функцией, ее можно вызвать, чтобы узнать, содержится ли параметр в переменной AlphaUsers, но прямой доступ к AlphaUsers в глобальной области недоступен (это становится своего рода приватная переменная).

1 & mdash; Примечание : Как упоминалось в комментариях cwolves, имейте в виду, что хотя (), добавляемый непосредственно после }, в этом случае работает, это только потому, что в этом случае определение функции является выражением функции . Если function является первым словом в строке, строка становится объявлением функции , и это все, что может сделать эта строка, функция не анонимна (для этого потребуется имя, в противном случае это синтаксическая ошибка) и не может быть вызвано сразу в строке. См. Объявления функций и выражения функций для получения дополнительной информации.

1 голос
/ 14 июля 2011

В частности, я не могу понять, почему мне нужно "()" в конце объявление функции.

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

Это в основном то же самое, когда вы вызываете функцию с суффиксом (), например:

myfunc();   // call this func
1 голос
/ 14 июля 2011

() в конце кода не связан с проблемой закрытия.Оборачивая вашу функцию в parens и добавляя () в конце, вы создаете анонимную функцию, которая запускается немедленно с любыми аргументами, которые вы передаете ().

0 голосов
/ 14 июля 2011

Анонимная функция верхнего уровня возвращает функцию, на которую ссылается isAlphasUser.

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

Думайте об этом так: внешняя анонимная функция - это фабрика функций, то есть она возвращает функцию.

Чтобы использовать любую функцию (даже ту, которая возвращает функцию), вы должны вызвать ее.

...