【发布时间】:2015-05-24 16:44:31
【问题描述】:
Google's Closure Compiler 有以下 CLI 选项:
-
--language_in– 设置输入源符合的语言规范。 -
--language_out– 设置输出应符合的语言规范。
语言
--language_in是什么意思?我认为它是以下之一:
- 源代码确实符合指定语言的声明/承诺。编译器不会验证它是否存在;它只是相信它确实如此。
- 用于验证源代码是否符合指定语言的编译器指令。如果没有,编译器会报错。
This documentation 似乎暗示意思#1:
项目可以使用
--language_in标志指定他们打算使用的 Ecmascript 语言版本。
但是,this documentation 表示含义 #2(我假设 language webservice 选项连接到 --language_in CLI 选项):
language参数指的是在检查代码中的错误时采用哪个版本的 ECMAScript。
ECMASCRIPT3– 假设符合 ECMAScript 3 的情况下检查代码,并使用仅存在于 ECMAScript 5 中的功能为代码提供错误。
如果我使用webservice 编译此代码:
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @language ECMASCRIPT3
// ==/ClosureCompiler==
var x = Object.freeze({
y: 3,
z: 4
});
console.log(x);
它不会给出Object.freeze() doesn't exist in ECMAScript 3 的错误。为什么不呢?
外语
同样,--language_out 是什么意思?我认为这意味着:
- 编译器必须生成符合指定语言的输出的指令。
但是如果我编译这段代码:
var x = Object.freeze({
y: 3,
z: 4
});
console.log(x);
使用此 CLI 命令,指定 --language_out ECMASCRIPT3:
java -jar compiler.jar \
--js test.js \
--js_output_file test.min.js \
--language_out ECMASCRIPT3 \
--compilation_level ADVANCED_OPTIMIZATIONS \
--warning_level VERBOSE \
--summary_detail_level 3
不会引发错误或警告:
0 error(s), 0 warning(s), 100.0% typed
编译后的代码是:
var a=Object.freeze({y:3,z:4});console.log(a);
所以输出不符合ECMASCRIPT3(因为它包含Object.freeze())。为什么不呢?
【问题讨论】:
-
试试
var foo = {delete: 42};。在 ES3 中,不允许在对象字面量中这样使用保留关键字。
标签: javascript google-closure-compiler