@const在javascript中?

时间:2010-08-06 04:59:54

标签: javascript google-closure-compiler

当我在Constant部分注意到带注释的注释时,我正在阅读http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml

/**
 * The number of seconds in each of the given units.
 * @type {Object.<number>}
 * @const
 */

然后指南继续“这允许编译器强制执行常量。”

这是v8的事吗?这在哪里记录?

我的想法很可能,也许,只是也许,我可以提供类型信息的v8(或其他)!

4 个答案:

答案 0 :(得分:7)

Google Closure Compiler可以接受JSDoc comments,它会产生警告或错误。

例如,如果您try使用高级优化编译以下代码:

/** @const */ var MY_BEER = 'stout';

MY_BEER = 'bar';

会产生错误:

  

错误数量:1

     

JSC_CONSTANT_REASSIGNED_VALUE_ERROR:常量MY_BEER在第5行8字符处分配了多次值

他们不鼓励const关键字,因为它不是ECMAScript标准的一部分。

答案 1 :(得分:3)

Javascript中有一个const关键字,但Internet Explorer无法识别它,因此您无法真正使用它。

这就是为什么Google的Javascript样式指南建议使用大写字母表示常量,或者将@const放入文档块中。

这两种技术都只是建议性的,对代码没有实际限制。

请注意,当您使用Google's Closure Compiler“编译”某些代码时,“编译器”将在注释块中查看此类内容,甚至生成警告和错误。但这与在实际的Javascript解释器中运行未经修改的代码是分开的。

答案 2 :(得分:0)

答案 3 :(得分:0)

这个问题有点老了,但是当前的Closure Compiler版本可以很好地处理const关键字,因为它将替换为var并且理解该变量是一个常量。

例如,在高级模式(--compilation_level ADVANCED_OPTIMIZATIONS)和polyfill重写(--rewrite_polyfills中,此关键字很重要,如前所述,“ [不要使用] const关键字,因为它是而不是ECMAScript标准的一部分”,但这会将其重写为var,以便在较旧的浏览器中很好地播放)

const get_selected_text = (/** @return {function():string} */ function() {
    if (window.getSelection || document.getSelection) {
        return function () {
            const selection = /** @type {function():Object<string,?>} */ (window.getSelection || document.getSelection)();
            if (typeof selection['text'] === "string") {
                return selection['text'];
            } else {
                return selection.toString();
            }
        };
    } else if (document.selection && document.selection.type !== "Control") {
        return function () {
            return document.selection.createRange().text;
        };
    }
    return function () {
        return '';
    };
})();

看起来像

var i=window.getSelection||document.getSelection?function(){var a=(window.getSelection||document.getSelection)();return"string"===typeof a.text?a.text:a.toString()}:document.selection&&"Control"!==document.selection.type?function(){return document.selection.createRange().text}:function(){return""};