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()
)。为什么不呢?
答案 0 :(得分:2)
对Object.freeze()
的调用不是语法错误。编译器无法知道您的代码是否在某些时候扩展了Object原型。因此Object.freeze()
是完全有效的ECMAScript 3代码。
类似地,
var x = {};
x.something();
是完全有效的代码。它会在运行时抛出异常,但这不是语法错误。
应该说明这些选项的ES5功能是使用保留字作为对象文字中的属性名称:
var x = { if: "hello world" };
另一个是getter / setter初始值设定项:
var x = { get hello() { return "world"; } };