【问题标题】:Flash AS2 (CS4) - setInterval causing for loop to not workFlash AS2 (CS4) - setInterval 导致 for 循环不起作用
【发布时间】:2010-01-12 03:21:56
【问题描述】:

我有一些简单的代码:

    function testing(){
       for (a=1; a<=4; a++) {
           this["btn"+a].enabled = true;
       }
    }

如果我从任何地方运行此功能,它都可以正常工作。如果我从 myTimer = setInteval(testing, 3000); 运行这个函数不起作用。如果我在函数中添加其他随机代码(仅新添加的代码)将起作用。所以我把它缩小到关于 this["btn"+a].enabled = true; 的东西,特别是导致它无法运行。

我真的希望这是有道理的,抱歉,现在是凌晨 3 点 :(.

有什么想法吗?

【问题讨论】:

    标签: flash actionscript


    【解决方案1】:

    你说的很有道理。当您正常调用该函数时,“this”就是您的对象。当您使用 setInterval 运行它时,您会丢失对“this”的引用。

    - 基于 cmets 编辑以帮助他人-

    这里有3种方法可以解决这个问题:

    这种方式涉及将“this”传递给您的函数:

    var that = this;
    setInterval(function() {testing(that)}, 1000);
    
    function testing(obj) {
        for (a = 1; a <= 4; a++) {
            obj["btn" + a].enabled = true;
        }
    }
    

    这种方式涉及将“this”传递给setInterval:

    setInterval(this, "testing", 1000);
    
    function testing() {
        for (a = 1; a <= 4; a++) {
            this["btn" + a].enabled = true;
        }
    }
    

    第三种方式涉及到Delagate类:

    import mx.utils.Delegate;
    
    setInterval(Delegate.create(this, testing), 1000);
    
    function testing() {
        for (a = 1; a <= 4; a++) {
            this["btn" + a].enabled = true;
        }
    }
    

    【讨论】:

    • 当调用您的示例中设置的函数时,我正在传递“this”,就像这样 testing(this);它是未定义的。您确实提醒我 AS2 支持 eval 所以我只是将 this["btn"+a] 更改为 eval("btn"+a) 并且它可以工作。非常感谢您的提醒:)
    • 很高兴您找到了解决方案。如果您觉得它有帮助,请接受此答案。
    • 如果我可以添加一个建议,使用 Delegate 将解决范围问题,您不需要使用 eval() 之类的技巧: myTimer = setInterval(Delegate.create(this, testing), 3000);这仍然会在计时器触发时调用 testing(),但范围将是 'this',所以 Kohan 的原始函数可以工作。
    • 好评。我会用更多信息修改我的答案。
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2011-12-20
    • 2021-05-11
    • 1970-01-01
    • 2017-04-13
    • 2013-12-31
    相关资源
    最近更新 更多