Что означает этот тип функции в JavaScript? - PullRequest
3 голосов
/ 09 июля 2010

В приведенном ниже тексте меня смущает синтаксис

(function (h,j) { })

Что значит в javascript иметь функцию внутри (), как это?

function myfunc(c, b) {
    try {
            (function (h, j) {
                //do a bunch of stuff
            })
    } catch (e) {
        myerror(e)
    }
};

Ответы [ 4 ]

15 голосов
/ 09 июля 2010

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

(function (h, j) { ... } (x, y));

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

Редактировать:

Некоторые примеры - надеюсь, это не смущает вещи ...

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

(function () {
    var x = 42;
    var y = 'foo';

    function doInitialisation(a, b) {
        // ...
    }

    doInitialisation(x, y);
}());

Ни один из x, y или doInitialisation не отображается после завершения функции.

Другой вариант использованиядля избежания замыканий в петлях.Например, следующее вызывает известную проблему:

var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    links[i].onclick = function () {
        alert(i);
    };
}

В приведенном выше примере каждый обработчик onclick имеет одинаковое значение i.Область действия функции может избежать этого:

var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    links[i].onclick = (function (x) {
        return function() {
            alert(x);
        }
    }(i));
}
4 голосов
/ 09 июля 2010

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

Так что пока

> function(x,y) {}
SyntaxError: Unexpected token (

само по себе является SyntaxError, но, заключив его в скобки, выражение в скобках вычисляется и возвращается.

> (function(x,y) {})
function (x,y) {}

Функциональные выражения и объявления не дают никакого значения, поэтому мы получаем undefined в результате.

Объявление функций

> function a(x,y) {}
undefined

Объявление функции (с оператором группировки)

(function a(x,y) {})
function a(x,y) {}

Выражение функции

> var x = function(x,y) {}
undefined

Выражение функции (с оператором группировки)

> var x;
> (x = function(x,y) {})
function (x,y) {}

Однако использование в вашем примере кажется бесполезным. Это ничего не делает.

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

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

(функция (h, j) { // делаем кучу вещей }) Вы можете получить доступ к переменным содержащей функции, здесь это function myfunc(c, b) {}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...