关闭编译后的Buggy代码

时间:2013-04-26 10:33:42

标签: javascript google-closure-compiler

我有几个对象;一个叫做DomDependent,一个叫做WorkFlow,一个叫做mediator。

domdependent具有以下代码:

  myApp.DomDependent.attachEvents=function(){
    myApp.mediator.attach("doConversion",mmt.WorkFlow.doConversion);

DomDependent在中介上注册“事件”,而WorkFlow具有实现它们的功能。当我使用在DomDependent之后列出的WorkFlow编译代码时,事件被注册但函数为空。当我使用在DomDependent之前列出的WorkFlow进行编译时,某些事件根本不会被注册,而有些事件会使用函数来实现它们。

我不确定实现循环依赖的正确方法是什么,因为WorkFlow对象也调用了Domdependent以获取文本框值等等:

来自WorkFlow:

myApp.DomDependent.removeAdded();

我试图在DomDependent(对于WorkFlow)和WorkFlow中将一个goog.require放到DomDependent中,但由于循环依赖,它根本不会编译。

因此,将goog.require语句移除到文件中的myApp,并将它们作为命令行参数提供给calcdeps.py:

set calc="D:\software\closure compiler\library\closure\bin\calcdeps.py"
c:\Python27\python.exe %calc% ^
--path D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\ ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\Mediator.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\WorkFlow.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\data.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\Messenger.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\DomDependent.js ^
--compiler_jar "D:\software\closure compiler\compiler.jar" ^
--output_mode compiled ^
--compiler_flags="--compilation_level=ADVANCED_OPTIMIZATIONS" ^
--compiler_flags="--formatting=PRETTY_PRINT" ^
--compiler_flags="--warning_level=VERBOSE" ^
--output_file D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\main.js
pause

我的问题是:

这是获得依赖的正确方法吗?如果我在DomDependent中选择goog.require,那么WorkFlow中的所有代码都将被删除,并且触发使用mediator注册的任何事件将尝试调用undefined。

我怎样才能确保不删除这些函数,通过调解器调用它们,但我认为编译器错过了其中的几个,我还没有找到原因。未编译的代码可以正常工作,但是在编译之后,调解器会尝试调用未使用的函数(也会编译调解器,因此它不是重命名函数的一部分)。

[UPDATE]

发现我怀疑事件未注册的一个错误。它已注册但由于重命名变量而无法执行任何操作。例如,此函数可将文本添加到行的开头或结尾:

    myApp.WorkFlow.addBegin=function(){
        myApp.WorkFlow.addEndOrBegin("begin");
    };
    myApp.WorkFlow.addEndOrBegin=function(whereTo){
        var where={begin:"",end:""},
        lines=myApp.DomDependent.getAddwordsContent(false).split("\n"),
        i;
        where[whereTo]=mmt.DomDependent.getBeginEnd();
            for(i=0;i<lines.length;i++){
              lines[i]=where.begin+lines[i]+where.end;
   ...

在编译版本中,where对象变量没有开始和结束属性,因此[“begin”]不存在或未定义。

我仍然想知道编译循环相关文件的正确方法。

1 个答案:

答案 0 :(得分:1)

您需要引用beginend属性。您当前正在引用它们作为引用属性和点缀,这违反了ADVANCED_OPTIMIZATIONS的属性重命名限制。见Implications of global variable, function, and property renaming

var where={begin:"",end:""}, //unquoted - quote these to fix

where[whereTo]=... //quoted