Это точно тип потенциальной ошибки, от которой вас предупреждает «опасное использование».В вашем примере, Closure Compiler может попытаться «сгладить» ваш код:глобальный объект (т. е. без ключевого слова "var" впереди), так что ваш код все еще может работать.Однако нельзя сказать, что в будущей версии этого не произойдет, и ваш код неожиданно сломается без предупреждения.
Конечно, затем «Bar $ member» и «Bar $ init»будет переименован в «a» и «b» соответственно.Это называется «выравнивание пространства имен» или «свертывание свойств».
Вы можете немедленно увидеть, что ваш код больше не работает правильно.Перед компиляцией, если вы напишите:
Bar.init();
this
будет ссылаться на Bar
.Однако после компиляции оно становится:
Bar$init();
this
больше не будет ссылаться на Bar
.Вместо этого он ссылается на глобальный объект.
Таким образом, компилятор пытается предупредить вас, что использование «this» таким способом «опасно», потому что «this» может быть изменено для ссылки на «глобальный "объект.Это истинное значение предупреждения.
Короче говоря, НЕ ДЕЛАЙТЕ ЭТОГО .Этот тип стиля кодирования создает ошибки, которые очень трудно отследить.
Измените код следующим образом:
var Bar = { // Closure Compiler treats globals and properties on global differently
member: null,
init: function() { Bar.member = {}; }
};
или используйте замыкание:
var Bar = (function() {
var member = null;
return {
init: function() { member = {}; }
};
})();
При использовании компилятора Closure в расширенном режиме не пытайтесь избавиться от предупреждений, аннотируя их.Предупреждения существуют по причине - они пытаются вас кое о чем предупредить.