проблема с запятыми в конце в JavaScript

Возможный дубликат:
Internet Explorer, компилятор Closure и конечные запятые

Я попытался сжать свой код javascript с помощью компилятора закрытия, и компиляция кода сгенерировала эти две ошибки:

JSC_TRAILING_COMMA: ошибка синтаксического анализа. IE8 (и ниже) будет неправильно анализировать запятые в литералах массивов и объектов. Если вы ориентируетесь на более новые версии JS, установите соответствующую опцию language_in. в строке 379 символ 0 fontFamily: jqTextareaDiv.css("font-family").replace(/["']{1}/gi,""),

JSC_TRAILING_COMMA: ошибка синтаксического анализа. IE8 (и ниже) будет неправильно анализировать запятые в литералах массивов и объектов. Если вы ориентируетесь на более новые версии JS, установите соответствующую опцию language_in. в строке 932 символа 0 fontFamily : jqDiv.css («семейство шрифтов»),

Эти две ошибки, похоже, относятся к этому коду:

var jqTextareaDiv = obj.target.parent().parent(),
                            style = {       // the current, relevant style rules for the DIV nesting the textarea
                                fontFamily     : jqTextareaDiv.css("font-family").replace(/["']{1}/gi,""),
                                fontSize       : jqTextareaDiv.css("font-size"),
                                fontStyle      : jqTextareaDiv.css("font-style"),
                                fontWeight     : jqTextareaDiv.css("font-weight"),
                                textDecoration : jqTextareaDiv.css("text-decoration"),
                                textAlign      : jqTextareaDiv.css("text-align"),
                                color          : jqTextareaDiv.css("color"),
                            },
                            jqToolbox = $('#text-edit-toolbox'),
                            jqIndicators = {
                                fontFamily                : $('#font-family-indicator'),
                                fontSize                  : $('#font-size-indicator'),
                                fontStyle                 : $('#font-format-indicators .font-style'),
                                fontWeight                : $('#font-format-indicators .font-weight'),
                                textDecorationUnderline   : $('#font-format-indicators .underline'),
                                textDecorationLineThrough : $('#font-format-indicators .line-through'),
                                textAlignLeft             : $('#text-alignment-indicators .align-left'),
                                textAlignCenter           : $('#text-alignment-indicators .align-center'),
                                textAlignRight            : $('#text-alignment-indicators .align-right'),
                                textAlignJustify          : $('#text-alignment-indicators .align-justify')
                            };

Какая именно конечная запятая в этом случае и как ее удалить, не нарушая код?


person Andrei Oniga    schedule 22.08.2012    source источник
comment
Ну, замыкающие запятые... замыкающие. ) Они следуют за последним элементом объявленного массива/объекта. color : jqTextareaDiv.css("color"), - это тот, который я нашел в вашем примере, возможно, есть и другие. На самом деле их местоположение было указано в сообщении об ошибке; чтобы исправить их, просто удалите запятые в ошибочной строке.   -  person raina77ow    schedule 22.08.2012
comment
Также похоже, что ваше регулярное выражение с его неэкранированными кавычками может вызывать проблему.   -  person Mike Robinson    schedule 22.08.2012
comment
Также указана причина их удаления: конечные запятые не подходят для IE8-. Если вам не нужно поддерживать этих зверей, просто установите соответствующую опцию language_in.   -  person raina77ow    schedule 22.08.2012
comment
@ raina77ow Это правда. Я нашел и исправил это, спасибо. Но я не могу найти первую, связанную со строкой, содержащей вызов .replace().   -  person Andrei Oniga    schedule 22.08.2012
comment
@MikeRobinson Ну, кавычки внутри литералов регулярных выражений довольно регулярны ... но это может быть причиной того, что синтаксический анализатор почему-то не работает, согласен. )   -  person raina77ow    schedule 22.08.2012
comment
@ raina77ow Да, но похоже, что компилятор задыхается от этой строки. Я предположил, что это может интерпретировать два как закрытие строки и заставлять запятую после /gi заглушать определение объекта.   -  person Mike Robinson    schedule 22.08.2012
comment
@AndreiOniga Попробуйте поиграть с кавычками в этом регулярном выражении, они, кажется, сбивают с толку Замыкание.   -  person raina77ow    schedule 22.08.2012
comment
На самом деле, это была одна и та же проблема в обоих случаях, я просто не понял этого из-за запятой в вызове replace().   -  person Andrei Oniga    schedule 22.08.2012


Ответы (3)


Завершающая запятая — это запятая, которая следует за последним элементом массива или литерала объекта. Ну вот так:

['a', 'b', 'c',] // with trailing comma
['a', 'b', 'c']  // without trailing comma

В этом случае запятая следует за последним элементом литерала вашего объекта:

color          : jqTextareaDiv.css("color"),

Если вы удалите его, произойдет ожидаемое поведение. С ним IE‹9 не понравится.

person lonesomeday    schedule 22.08.2012
comment
Я нашел и исправил этот, но не могу найти первый, который (предположительно) находится в той же строке, что и вызов метода .replace() - person Andrei Oniga; 22.08.2012
comment
@AndreiOniga Ну, в этом нет ничего плохого. Я предполагаю, что компилятор замыкания путается с " в регулярном выражении - попробуйте экранировать его \", чтобы помочь компилятору... - person lonesomeday; 22.08.2012
comment
На самом деле это не так. Я просто не заметил один после цвета: jqTextareaDiv.css(color), только второй. Виноват. Спасибо! - person Andrei Oniga; 22.08.2012
comment
Если вам не нужно поддерживать IE ниже 9, вы также можете переключить компилятор в режим ECMASCRIPT 5, где поведение завершающих запятых было стандартизировано (это позволит компилятору эффективно удалить замыкающую запятую). - person John; 23.08.2012
comment
Переключатель компилятора Closure, о котором Джон не упомянул :-) --language_in ECMASCRIPT5 - person Michaelangel007; 28.01.2013

Это завершающая запятая:

color          : jqTextareaDiv.css("color"), <<--
person Aaron Digulla    schedule 22.08.2012

У вас есть конечная запятая в color : jqTextareaDiv.css("color"),. Это будет первое предупреждение. Второе предупреждение, вероятно, является аналогичным определением где-то еще в вашем коде.

person mamapitufo    schedule 22.08.2012