Вопрос по google-closure-compiler, google-closure, javascript – ВНИМАНИЕ - опасное использование глобального объекта

8

В Google Closure Compiler я получаю предупреждение

ВНИМАНИЕ - опасное использование глобального объекта

Вот пример. Строка ошибки и смещение относятся к началу словаthis

function aToggle() {
  if(shown)
    toggle.show()
  else
    toggle.hide()
  $(this).text(shown ? 'Click to hide' : 'Click to show')
  shown = !shown
}
link.onclick = aToggle

Я просто изменил бы это на анонимный метод, но я повторно используюaToggle в другом месте файла, поэтому он должен быть назван.

Я мог отметитьaToggle как/**@constructor*/ - но это не конструктор. Есть ли другая аннотация, которую я могу использовать для устранения этого предупреждения, или я застрял между пометкой его как конструктора или появлением множества бесполезных предупреждений?

Да, я использую aToggle в других местах. Приведенный выше код является просто примером, который я написал. Bryan Field
Хорошо, это легко сделать. Так или иначе:shown а такжеtoggle является глобальным? Я не использовал Google Closure Compiler, но он, вероятно, не знает, что ваш aToggle является обработчиком событий. Посмотрите, есть ли где-нибудь, вы можете сказать это, потому что тогдаthis не нужно глобальноеthis. some

Ваш Ответ

2   ответа
13

редактировать: Я читал Closure: полное руководство, и я только что понял, что вы можете просто добавить/** @this {Element} */ аннотирование перед вашим обработчиком событий, чтобы заставить Closure Compiler перестать жаловаться.

УвидетьПредупреждение о закрытии компилятора, Закрывающий компилятор выдает это предупреждение при использованииthis внутри функции, которая не аннотирована/** @constructor */ или находится в пределахprototype класса. Компилятор предполагает, что вы никогда не будете использоватьthis когда функция вызывается в контексте другого объекта (что и делают обратные вызовы событий).

Некоторые места, которые вам, возможно, придется изменить, чтобы компилятор Closure перестал жаловаться с этим предупреждением:

Не использоватьlink.onclick = ... напрямую, потому что вы должны связываться сthis а такжеe || window.event, Вместо этого используйте jQuery для переноса обработчика событий, так какОбъект события jQuery имеетe.currentTarget.Если вы используетеthis в пределахjQuery.eachзаменитьthis со вторым параметром вашей функции. Например.,jQuery.each([1, 2, 3], function(i, val) { ... val ... };.
1

Я не очень хорошо знаю JQuery, но думаю, что вы можете использовать что-то вроде:

function aToggle(event) {
  if(shown) {
    toggle.show();
  } else {
    toggle.hide();
  }
  $(event.target).text(shown ? 'Click to hide' : 'Click to show');
  shown = !shown;
}

$(link).bind('click', aToggle);

где вы извлекаете выбранную цель из универсального объекта события кросс-браузера.

РЕДАКТИРОВАТЬ: в качестве совета, используйте{ } с вашимif else и используйте точки с запятой, не полагайтесь на свой браузер, чтобы сделать это за вас.

Чтобы наилучшим образом использовать инструменты закрытия, рекомендуется использовать библиотеку закрытия в сочетании с компилятором (хотя и не обязательно)

Зачем тебе день, когда я должен использовать фигурные скобки и точки с запятой? Bryan Field
Я еще не тестировал его, меня переместили в другие проекты, но я не забуду вернуться к принятию правильного ответа. Я посмотрел на компилятор, и он фактически удаляет скобки и добавляет точки с запятой, что приятно. Спасибо за упоминание этого. Bryan Field
'should' может быть немного сильным, но фигурные скобки действительно улучшают читаемость программ, в которых он используется для группировки кода. Точка с запятой:stackoverflow.com/questions/444080/... , Но что более важно, мое решение работает для вас? Jan

Похожие вопросы