Я не могу понять скобки в этом утверждении JavaScript - PullRequest
1 голос
/ 16 февраля 2011

Я не могу понять скобки в выражении JavaScript ниже:

({go_go: 'go'});

Что означает () здесь?

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

(function () {
    alert('something');
})();

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 февраля 2011

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

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

var s = '{"go_go": "go"}';

... и использовать его для десериализации:

var o = eval('(' + s + ')');

Это старый способ решения некоторых проблем, но вам намного лучше использовать надлежащую библиотеку синтаксического анализа JSON, например любую из трех, перечисленных на странице Крокфорда на github . (Крокфорд является изобретателем JSON.) Там есть один, который делает несколько регулярных выражений для обнаружения различного материала с искаженным JSON, а затем использует eval, и два других, которые вообще не используют eval. (Я бы никогда не использовал eval при работе с JSON из ненадежного источника.)

1 голос
/ 16 февраля 2011

Я думаю Почему для eval в JavaScript нужны скобки для оценки данных JSON? отвечает на ваш вопрос.

Они вам не нужны, если в вашем коде просто обычный литерал объекта.

В вашем выражении функции внешние () не делают функцию анонимной (она уже не имеет имени). Однако для выполнения анонимной функции сразу после ее определения они необходимы, поскольку function(){}(); недопустимо.

0 голосов
/ 16 февраля 2011

Некоторые люди привыкли окружать объекты JSON круглыми скобками ...

var jsonObject = ({go_go: 'go'});

То же, что и

var jsonObject = {go_go: 'go'};

Причина, по которой они это делают, заключается в том, что если вы извлекаете объекты JSON с помощью вызова AJAX, вам часто требуется скобка, чтобы предотвратить общую ошибку разбора.

Следующая строка кода часто вызывает ошибку недопустимой метки:

var jsonObject =  eval(stringOfJson);

И это обычно решается следующим образом:

var jsonObject =  eval( "(" + stringOfJson + ")" );

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

(function () {
    alert('something');
}());

И единственная причина, по которой вы используете круглые скобки, заключается в том, что они делают непосредственную функцию более очевидной (как рекомендовано www.jslint.com среди других!)

...