当我在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(或其他)!
答案 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""};