AS3放置函数blah(){围绕代码在我没有的代码行上生成错误

时间:2012-02-27 12:16:27

标签: actionscript-3

我有一块代码正在做我想做的事情 - 它会生成一个MC的网格。

当我在它周围添加类似函数blah()之类的东西时,它会开始生成错误,指示我没有的代码行。例如

  

TypeError:错误#1010:术语未定义且没有属性       at flightCellMaker_fla :: MainTimeline / myXMLtrace()[flightCellMaker_fla.MainTimeline :: frame1:87]
      at flightCellMaker_fla :: MainTimeline / processFPBxml()[flightCellMaker_fla.MainTimeline :: frame1:52]
      在flash.events::EventDispatcher/dispatchEventFunction()
      在flash.events :::EventDispatcher / dispatchEvent()
      在flash.net::URLLoader/onComplete()

当我拿出这个功能时,它会按照我的意愿去做。怎么了?

var testXML:XML;
var myFPBxml:XML;

// Initialise a URLLoader to get XML data from XML file
var myFPBLoader:URLLoader = new URLLoader();
myFPBLoader.load(new URLRequest("flightPlannerBoard.xml"));


 // Check XML data fully loaded
 myFPBLoader.addEventListener(Event.COMPLETE, processFPBxml);


// Once the flight board planning data is loaded, save it to a variable
function processFPBxml(e:Event):void {
myFPBxml = XML(e.target.data);
myXMLtrace();
 }  


// Grab the XML data load completed and make it available elsewhere
function myXMLtrace(){
testXML = XML(myFPBxml);
}
trace("***********************" + testXML.*); This throws an error (not within myXMLtrace tho)

好的,所以这里的其余代码将在它自己的正确运行但不在函数中运行:

// Create and place all the flight cells for planning and drag and drop 

// Setup 2 loops: j for columns and i for Rows
for (var j:Number =0; j < rowNum; j++){

for (var i:Number =0; i<9; i++){

    // Create copies of flightCell for board grid
    var my_mc = new flightCell();
    my_mc.name = "mc"+i+j;

    addChild(my_mc);

    // Set event Listeners on all Child objects
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_OVER, fl_MouseOverHandler);
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_OUT, fl_MouseOutHandler);
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_DOWN, fl_MouseDownHandler);
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_UP, fl_MouseUpHandler);

    Object(this).my_mc.yellowHiLite.visible = false;


    //cellPos[j] = myXML.cellPosX[j];
    //trace(stage.myXML.*);

    //trace(my_mc.name);
        my_mc.x = (100 + colWidth);
        my_mc.y = myRowHeight;

    colWidth = colWidth + 155;

    //trace(myXML.*);

    cellArray[arrayCount] = [my_mc.x, my_mc.y];
    trace("CellArrayCount = " + cellArray[arrayCount]);
    arrayCount = arrayCount + 1;
}

myRowHeight = myRowHeight + 105;
colWidth = 50;
}

3 个答案:

答案 0 :(得分:2)

您的跟踪引发了错误,因为它是在加载XML之前执行的。

ActionScript是异步的,这意味着在加载XML时,程序执行继续进行,看起来像这样:

  1. 声明testXML:XMLmyFPBxml:XML
  2. 创建加载程序并开始加载
  3. 添加用于加载完成的侦听器
  4. 追踪testXML
  5. 加载XML时执行processFPBxml
  6. 如果您将跟踪移动到myXMLTrace功能,那么它将正常工作。


    使用新添加的代码,问题在于这一行:

    Object(this).my_mc.yellowHiLite.visible = false;
    

    此处无需使用this关键字。这将在函数内部或外部工作:

    my_mc.yellowHiLite.visible = false;
    

    您的代码在函数内部失败的原因是因为函数this的内部和外部将是此代码所在的对象的范围。但是,当您将代码放入函数时,您创建的引用 - my_mc - 本地作用于函数,而不是父对象,因此this.my_mc未定义,因为{{1} }不是函数范围。

答案 1 :(得分:0)

您是从当前的函数中取出代码并从以下代码调用新函数吗?或者您是否尝试定义函数变量? 如果你只是将函数blah(){...}放在它当前运行的同一个地方的代码中,你肯定会得到一个语法错误。在这种情况下,请尝试:

var blah:Function= function() { ... };
blah();

答案 2 :(得分:0)

如果在函数中声明变量,它们只属于函数的范围。

听起来您正试图从代码中的其他位置访问变量。

所以你需要做的就是在函数之外声明你的变量。 e.g。

var one:VarType;
var two:VarType;

function blah():void {
 trace(one);
}