Closure Compiler:--language_in和--language_out选项的用途?

时间:2015-05-24 16:44:31

标签: javascript google-closure-compiler

Google's Closure Compiler有以下CLI选项:

  • --language_in - 设置输入源符合的语言规范。
  • --language_out - 设置输出应符合的语言规范。

中的语言

--language_in的含义是什么?我认为它是以下之一:

  1. 声明/承诺源代码确实符合指定的语言。编译器不会验证它确实存在;它只是相信它确实存在。
  2. 指示编译器验证源代码是否符合指定语言的指令。如果没有,编译器将引发错误。
  3. 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())。为什么不呢?

1 个答案:

答案 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"; } };