闭包编译后的错误代码



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

domdependent的代码如下:

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

DomDependent在中介上注册"事件",WorkFlow具有实现它们的函数。当我用DomDependent后列出的工作流编译代码时,事件被注册,但函数为空。当我用DomDependent之前列出的工作流编译时,一些事件根本不会注册,有些事件用函数来实现它们。

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

从工作流:

myApp.DomDependent.removeAdded();

我试着把一个好。在DomDependent (to WorkFlow)和WorkFlow to DomDependent中都需要,但由于循环依赖,它根本不会编译。

所以去掉了好。在文件中要求myApp的语句,并将它们作为命令行参数提供给calcdeep .py:

set calc="D:softwareclosure compilerlibraryclosurebincalcdeps.py"
c:Python27python.exe %calc% ^
--path D:flex_sdk_4.6projectsEnglishConverterbinjs ^
--input D:flex_sdk_4.6projectsEnglishConverterbinjsmyAppMediator.js ^
--input D:flex_sdk_4.6projectsEnglishConverterbinjsmyAppWorkFlow.js ^
--input D:flex_sdk_4.6projectsEnglishConverterbinjsmyAppdata.js ^
--input D:flex_sdk_4.6projectsEnglishConverterbinjsmyAppMessenger.js ^
--input D:flex_sdk_4.6projectsEnglishConverterbinjsmyAppDomDependent.js ^
--compiler_jar "D:softwareclosure compilercompiler.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.6projectsEnglishConverterbinjsmain.js
pause

我的问题是:

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

我如何确保函数不被删除,它们是通过中介调用的,但我认为编译器错过了其中的几个,我还没有找出原因。未编译的代码可以工作,但编译后中介试图调用不存在的函数(中介也被编译,所以它不是重命名函数部分)。

(更新)

发现了一个我怀疑事件没有注册的bug。它是注册的,但由于重命名变量,它不做任何事情。例如,以下函数将文本添加到行首或行尾:

    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和end属性,因此where["begin"]不存在或未定义。

我仍然想知道正确的方法是编译循环依赖文件

您需要引用beginend属性。您目前将它们引用为引用属性和虚线,这违反了ADVANCED_OPTIMIZATIONS的属性重命名限制。参见全局变量、函数和属性重命名的含义

var where={begin:"",end:""}, //unquoted - quote these to fix
where[whereTo]=... //quoted

相关内容

最新更新