1

リストから「前」と「次」の画像を表示できる単純なオブジェクト「ブラウザ」を定義しています。

function Browser(image, elements) {
    this.current = 0;
    this.image = image;
    this.elements = elements;
}
Browser.prototype.next = function () {
    if (++this.current >= this.elements.length) {
         this.current = 0;
    }
    return this.show(this.current);
};
Browser.prototype.prev = function () {
    if (--this.current < 0) {
        this.current = this.elements.length - 1;
    }
    return this.show(this.current);
};
Browser.prototype.show = function (current) {
    this.image.src = this.elements[current];
    return false;
};

このコードは JSlint にほぼ好まれています。しかし、「高度な最適化」の Google Closure Compiler はそれをコンパイルしません。

それは言います:

JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 3 character 0
this.current = 0;
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 4 character 0
this.image = image;
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 5 character 0
this.elements = elements;

これは、javascript oop を理解していないことを示しています。

私は何を間違っていますか?

4

2 に答える 2

6

JSC_USED_GLOBAL_THIS:グローバルな this オブジェクトの危険な使用。

この警告は、キーワード this をプロトタイプ関数またはコンストラクター関数の外で使用することを意味します。たとえば、次のコードはこの警告を生成します。

// Produces JSC_USED_GLOBAL_THIS warning:
this.foo = 1;

この場合、これは実際にはグローバルな this オブジェクトを参照します。標準的な Web ページの場合、グローバル オブジェクトはウィンドウ オブジェクトと同じものです。この警告が表示された場合は、本当にグローバル オブジェクトを参照するつもりだったのかを確認してください。

コンパイラは、次のように @constructor JSDoc アノテーションが付けられている場合にのみ、関数をコンストラクターとして認識することに注意してください。

/**
 * @constructor
 */
function MyFunction() {
  this.foo = 1;
}

https://developers.google.com/closure/compiler/docs/error-ref

于 2013-02-08T17:33:02.430 に答える
4

ドキュメントから:

コンパイラは、次のように @constructor JSDoc アノテーションが付けられている場合にのみ、関数をコンストラクターとして認識することに注意してください。

/**
 * @constructor
 */
function MyFunction() {
  this.foo = 1;
}
于 2013-02-08T17:33:10.463 に答える