Ошибка синтаксиса пробелов в JavaScript - PullRequest
8 голосов
/ 11 октября 2009

Почему это вызывает синтаксическую ошибку для оператора return:

var FOO = (function($)
{
    return
    {      
        init: function()
        {

        }
    }
})(jQuery);

Принимая во внимание, что это не так:

var FOO = (function($)
{
    return {      
        init: function()
        {

        }
    }
})(jQuery);

Почему есть разница?

1 Ответ

21 голосов
/ 11 октября 2009

Речь идет не о пробелах, а об автоматической вставке точек с запятой с помощью JavaScript.

Спецификация ECMAScript гласит

Некоторые операторы ECMAScript (пусто оператор, переменная оператор, выражение выражения, сделай пока заявление, продолжить заявление, перерыв утверждение, возврат заявления и бросок заявление) должен быть прекращен с точка с запятой. Такие точки с запятой могут всегда появляются явно в исходном тексте. Для удобства, однако, такие точки с запятой могут быть опущены исходный текст в определенных ситуациях. Эти ситуации описаны говоря, что точки с запятой автоматически вставляется в источник Поток токена кода в этих ситуациях.

Это означает, что ваш код

var FOO = (function($)
{
    return
    {      
        init: function()
        {

        }
    }
})(jQuery);

переводится как

var FOO = (function($)
{
    return; // <- JavaScript will insert a semicolon here.

    {      
        init: function()
        {

        }
    }
})(jQuery);

Таким образом, FOO будет неопределенным после выполнения функции.

Для вашего другого кода: JS не будет вставлять точку с запятой и будет работать правильно JS вставит точку с запятой после вашего литерального объекта, и она должна работать нормально. [РЕДАКТИРОВАТЬ: Исправление, как указано kagnax]

Это означает, что вы всегда должны заканчивать свои утверждения точкой с запятой. Разрешение вставки точки с запятой в движок JS может привести к очень тонким ошибкам, отладка которых займет несколько часов. Вы можете использовать такой инструмент, как JSLint , который предупредит вас о пропущенных точках с запятой.

...