【问题标题】:Actionscript 2 functions动作脚本 2 函数
【发布时间】:2010-09-13 14:49:18
【问题描述】:

我是一位经验丰富的程序员,但刚开始使用 Flash/Actionscript。我正在做一个项目,由于某些原因需要我使用 Actionscript 2 而不是 3。

当我运行以下命令时(我只是将它放在新 Flash 项目的第一帧中),输出是 3 而不是 1 ?我需要它是 1。

为什么 'ii' 变量的范围在循环之间继续?

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1; 
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();

【问题讨论】:

    标签: actionscript actionscript-2


    【解决方案1】:

    不幸的是,AS2 不是那种语言。它没有那种封闭。函数在 AS2 中并不完全是一等公民,其结果之一是函数不保留自己的作用域,它必须在调用时与某个作用域相关联(通常与函数所在的作用域相同)本身已定义,除非您使用函数的 callapply 方法)。

    然后当函数被执行时,它内部的变量范围就是它碰巧被调用的范围——在你的例子中,你的循环之外的范围。这也是您可以这样做的原因:

    function foo() {
        trace( this.value );
    }
    
    objA = { value:"A" };
    objB = { value:"B" };
    
    foo.apply( objA ); // A
    foo.apply( objB ); // B
    
    objA.foo = foo;
    objB.foo = foo;
    
    objA.foo(); // A
    objB.foo(); // B
    

    如果你习惯了真正的OO语言那看起来很奇怪,原因是AS2最终是一个prototyped language。一切看起来面向对象的东西都只是巧合。 ;D

    【讨论】:

      【解决方案2】:

      不幸的是,Actionscript 2.0 没有强大的范围......尤其是在时间线上。

      var fs:Array = new Array();
      
      for (var i = 0; i < 3; i++){
      
          var ii = i + 1;     
          fs[i] = function(){
              trace(ii);
          }
      }
      
      fs[0]();
      trace("out of scope: " + ii + "... but still works");
      

      【讨论】:

        【解决方案3】:

        我想出了一种解决我自己问题的策略:

        var fs:Array = new Array();
        
        for (var i = 0; i < 3; i++){    
            var ii = i + 1;   
        
            f = function(j){
                return function(){
                    trace(j);
                };
            };
            fs[i] = f(ii);
        }
        
        fs[0](); //1
        fs[1](); //2
        fs[2](); //3
        

        【讨论】:

        • 这也是我在回复中试图说的,但由于某种原因,代码已损坏且无法正确显示
        猜你喜欢
        • 2010-12-09
        • 2016-03-27
        • 2016-01-23
        • 2010-12-20
        • 2015-09-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        相关资源
        最近更新 更多