Closure Compiler不对此应用@const

时间:2012-04-01 04:12:46

标签: javascript google-closure-compiler

我想让这段代码正常工作:

/** @constructor */
function Foo()
{
    /** @const */
    this.bar = 5;

    // edit: does now work
    // this.bar = 3;
}

var f = new Foo();

// should be inlined (like other constants)
alert(f.bar);

我已经尝试添加更多注释(类型,构造函数),@enum而不是@const(对于this.bar),me = this所有这些都没有任何效果

help page对此并没有多大帮助。

有没有办法让这个工作? 如果没有,为什么?

3 个答案:

答案 0 :(得分:2)

添加/** @constructor */有效:

/** @constructor */
function Foo()
{
    /** @const */ 
    this.bar = 5;

    // cc does not complain
    //this.bar = 3;
}

var f = new Foo();

// should be inlined
alert(f.bar);

汇编为:

alert((new function() { this.a = 5 }).a);

如果我取消注释this.bar = 3;,我会收到此预期警告:

JSC_CONSTANT_PROPERTY_REASSIGNED_VALUE: constant property bar assigned a value more than once at line 9 character 0
this.bar = 3;
^

答案 1 :(得分:2)

编译器没有任何通用的“内联属性”逻辑。您可以使用原型函数将此内容置于ADVANCED模式中:

/** @constructor */
function Foo() {}
Foo.prototype.bar = function() { return 5 };

var f = new Foo();
alert(f.bar());

将编译为:

alert(5);

如果方法“bar”只有一个定义,并且“bar”仅在调用表达式中使用过,编译器将执行此操作。在一般情况下,用于此的逻辑是不正确的(如果调用是在没有定义“bar”的对象上,则调用将抛出)。但是,它被认为是“足够安全”。

答案 2 :(得分:0)

在文档中说:

如果为@const标记的变量被赋值多次,编译器会发出警告。 If the variable is an object, note that the compiler does not prohibit changes to the properties of the object.

P.S .: 你在脚本或HTML页面中包含以下代码吗?

  <script src="closure-library/closure/goog/base.js"></script>