2012-07-01 2 views
3

У меня есть некоторый код, который выглядит следующим образом:«опасно использование глобальной этого объекта» предупреждение в Google Closure Compiler

var MyObject = function() { 
    this.Prop1 = ""; 
    this.Prop2 = []; 
    this.Prop3 = {}; 
    this.Prop4 = 0; 
} 

А потом я потом есть это:

var SomeObject = new MyObject(); 

Когда я бегу мой код через компилятор закрытия в расширенном режиме, я получаю предупреждение dangerous use of the global this object на каждой строке, где у меня есть this.Prop =

Что я делаю, это «опасно» и как шо uld Я переписываю свой код?

Спасибо за ваши предложения.

+0

Возможный дубликат: http://stackoverflow.com/questions/5301373/closure-compiler-warning-dangerous-use-of-the-global-this-object –

ответ

6

Я бы рекомендовать писать так:

function MyObject() { 
    this.Prop1 = ""; 
    this.Prop2 = []; 
    this.Prop3 = {}; 
    this.Prop4 = 0; 
} 

Однако реальное исправление использовать @constructor JSDoc обозначения на линии перед конструктором:

/** @constructor */ 
+0

ОК, спасибо, это был недостающий @constructor что вызывало проблему. – frenchie

+0

Если это была функция, которая модифицировала существующий объект (а не метод, который вызывается с «новым»), вы можете использовать аннотацию «@this {SomeType}». – John

4

Closure Compiler Error and Warning Reference обеспечивает подробные пояснения к предупреждениям, связанным с опасным использованием this:

  • JSC_UNSAFE_THIS
  • JSC_USED_GLOBAL_THIS

Предупреждение об использовании глобальной this объекта помогает предотвратить случайный вызов функции конструкторы без new ключевого слова, которое приводило бы к свойствам конструктора протекающим в глобальную область видимости. Однако для компилятора, чтобы знать, какие функции предназначены для конструкторов, требуется аннотация /** @constructor */.

Смежные вопросы