назначение "(function () {" в начале скриптов (только GreaseMonkey?) - PullRequest
0 голосов
/ 19 декабря 2010

Я довольно новичок в JavaScript, который я изучаю самостоятельно.В настоящее время я создаю и настраиваю скрипты GreaseMonkey.Я заметил, что большинство простых скриптов (то есть тех, которые не нуждаются в именованных функциях) идут прямо в основной код, но некоторые вместо этого настраиваются так:кодирования?Я прокомментировал как верх, так и низ, и сценарий по-прежнему работает точно так же.

Это просто стандарт кодирования или он действительно имеет функцию?И, как спрашивает мой заголовок, это что-то особенное для GreaseMonkey или что-то, что я должен делать постоянно?

Ответы [ 4 ]

8 голосов
/ 19 декабря 2010

Этот метод эффективно создает личное пространство имен, доступное только этому сценарию.Например, этот код:

(function() {
    var a = 5;
})();

не будет иметь никакого влияния на глобальное пространство имен (переменная a захвачена замыканием, поэтому window.a не будет затронута),Это очень хороший способ не дать многим скриптам наступать на глобальные переменные друг друга, вообще делая их не глобальными.Я использую эту технику все время при написании любого JavaScript, а не только скриптов Greasemonkey, и настоятельно рекомендую его в качестве наилучшей практики при написании библиотек.

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

var MyNamespace = (function () {
    var that = {};

    that.square = function(x) {
        return x*x;
    };

    return that;
})();

Тогда вы можете сделать MyNamespace.square(5) из другого скрипта, и это вернет 25.

3 голосов
/ 19 декабря 2010

Это самоисполняющаяся анонимная функция.

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

2 голосов
/ 19 декабря 2010

Код служит двум целям:

  1. Хранит объекты / переменные локально для области анонимной функции.Это важно, поскольку мы видим, что у вас может быть несколько файлов сценариев, которые могут иметь одно и то же имя переменной.Если бы они это сделали, они могли бы заменить значение переменной и действительно испортить ваше приложение.

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

0 голосов
/ 19 декабря 2010

Вот ответ для тех, кто никогда не слышал о замыканиях слова:

Предположим, у нас есть функция

function sayHi() { alert('Hello'); }

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

sayHi();

Выше указано то, что называется именованной функцией, если вы не знаете, что это значит, то это то, о чем вы думаете, когда слышите слово function

В некоторых языках вам не нужноНазовите функцию, вы можете оставить ее пустым, например, так:

alert('Sup');
function() {alert('Hello'); }
3 + 1;
alert('Peace');

Строка 2 совершенно корректна.Конечно, строка 2 ничего не сделает на вашей странице, точно так же, как строка 3 ничего не делает.Это называется анонимной функцией.Теперь, точно так же, как мы можем присвоить переменную строке 3, например:

result = 3 + 1;

Мы можем сделать то же самое со строкой 2, например:

myFunc = function() { alert('Hello'); };

И мы можем использовать myFunc какфункционировать как функция sayHi () раньше.Мы называем это так же, как мы называем sayHi ()

sayHi();
myFunc();

Теперь, поскольку javascript написан для универсальности, где такие вещи, как [0, 1, 2] .indexOf (1) работают, мы можем сделать следующее:

func = function() { alert('hello'); };
func();
(function() { alert('hello'); })();

И строки 1 и 2 будут выполнять то же самое, что и строка 3, поскольку строка 3 - это просто расширенная версия строк 1 и 2. Преимущество строки 3 состоит в том, что если кто-то позже вкод использует переменную func, это не вызовет проблем с вашим собственным кодом, также любые переменные, объявленные в функции строки 3 (с ключевым словом var), не будут допустимой переменной вне вашей функции, что в данном случае являетсязакрытие.

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

...