AS2 计算中 eval() 的最佳替代品

Posted

技术标签:

【中文标题】AS2 计算中 eval() 的最佳替代品【英文标题】:best replacement for eval() in AS2 calculation 【发布时间】:2016-04-09 09:04:36 【问题描述】:

我有一个简单的计算器脚本,我必须将 var a = eval(tmp); 替换为可以使用的东西。例如var tmp 可以用4+5 填充。在普通的 JS 中,这应该可以工作并输出 9,但在 AS2 中它不会。 trace(a) 输出 undefined。我应该改变什么,让它工作。 有没有类似的命令,比如 JS 里的?

这里是完整的 ActionScript:

寻找BtnCalc.onPress = function()

var calcArr = new Array();

Btn0.onPress = function() 
    calcArr[calcArr.length] = 0;


Btn1.onPress = function() 
    calcArr[calcArr.length] = 1;


Btn2.onPress = function() 
    calcArr[calcArr.length] = 2;


Btn3.onPress = function() 
    calcArr[calcArr.length] = 3;


Btn4.onPress = function() 
    calcArr[calcArr.length] = 4;


Btn5.onPress = function() 
    calcArr[calcArr.length] = 5;


Btn6.onPress = function() 
    calcArr[calcArr.length] = 6;


Btn7.onPress = function() 
    calcArr[calcArr.length] = 7;


Btn8.onPress = function() 
    calcArr[calcArr.length] = 8;


Btn9.onPress = function() 
    calcArr[calcArr.length] = 9;


BtnCalc.onPress = function() 
    var tmp;
    for (var i = 0;i<calcArr.length;i++)
        if (i>=1)
            tmp = tmp+calcArr[i];
        else
            tmp = calcArr[i];
        
        trace(tmp);
    
    var a = eval(tmp);
    trace(a);


BtnAdd.onPress = function() 
    calcArr[calcArr.length] = "+";


BtnSubtract.onPress = function() 
    calcArr[calcArr.length] = "-";


BtnMult.onPress = function() 
    calcArr[calcArr.length] = "*";


BtnDivide.onPress = function() 
    calcArr[calcArr.length] = "/";

【问题讨论】:

你为什么还在使用actionscript 2? actionscript 3 的表现要好得多 对不起朋友,我本来可以帮助你的,但是任何 adobe 产品都不再支持 Actionscript 2。如果你喜欢 actionscript 3,我可以给你替代脚本 因为我们学校只使用 Macromedia Flash 8 :/ 好吧,这就是遗产。无论如何,让我们看看我能做什么。但老实说,我只能给你未经测试的建议。我没有可以测试的 Macromedia Flash 8。 如果您能提出解决方案,欢迎您。我将在明天的课堂上对其进行测试,然后发布结果。 【参考方案1】:
var p = "+", m = "*", s = "-", d = "/", D = ".", e = "=";
_global.lastOperator = "+";
label.text = this._name.split("_")[1];
if (eval(label.text) != undefined) 
    label.text = eval(label.text);

_global.a = 0;
_global.b = 0;
this.onPress = function() 
    switch (label.text) 
    case "C" :
        _global.a = 0;
        _global.b = 0;
        _global.lastOperator = "+";
        trace2(_global.b);
        break;
    case "=" :
        calc();
        _global.b = _global.a;
        _global.a=0;
        _global.lastOperator = "+";
        break;
    case "+" :
        calc();
        _global.lastOperator = "+";
        break;
    case "-" :
        calc();
        _global.lastOperator = "-";
        break;
    case "*" :
        calc();
        _global.lastOperator = "*";
        break;
    case "/" :
        calc();
        _global.lastOperator = "/";
        break;
    default :
        _global.b = _global.b+""+label.text;
        trace2(parseFloat(_global.b));
        break;
    
;
function trace2(msg) 
    _root.op.text = msg;

function calc() 
    switch (_global.lastOperator) 
    case "+" :
        _global.a += parseFloat(_global.b);
        trace2(_global.a);
        break;
    case "-" :
        _global.a -= parseFloat(_global.b);
        trace2(_global.a);
        break;
    case "*" :
        _global.a *= parseFloat(_global.b);
        trace2(_global.a);
        break;
    case "/" :
        _global.a /= parseFloat(_global.b);
        trace2(_global.a);
        break;
    
    _global.b=0;

不幸的是,actionscript 2 中没有eval() 替代方案。因此您应该将整个编码模式更改为类似的内容。

使用名为“label”的动态文本区域创建一个影片剪辑,并使用操作面板将上述代码粘贴到影片剪辑的第一帧。

现在您可以创建同一影片剪辑的多个实例并将它们命名为

“btn_0”,

“btn_1”,

“btn_2”,

...,

“btn_9”,

"btn_p",

"btn_m",

“btn_s”,

“btn_d”,

“btn_D”,

“btn_e”

在按钮之后,在舞台的根部创建一个名为“op”的动态文本区域。

就是这样,你得到了你的计算器。

另外,请查看第 4 行以了解正确使用 as2 eval()

我强烈建议不要使用 actionscript 2,因为它已经过时了。

完成的代码可以从我的google drive link下载。

【讨论】:

Picture-Link 这是我为您编辑的屏幕截图。你能发现一个错误。它在标签文本字段中输出一个“未定义”,我将所有 Buttons-Instanzes 命名为新的,到 btn_0...。它是德语程序布局,但应该类似于英语。 看起来你在上面的行中弄错了:创建一个带有名为“label”的动态文本区域的影片剪辑 创建一个movieclip并在其中放置一个名为“label”的动态文本区域 如何从给定的链接下载完成的 .fla 文件并检查你做错了什么。 你能不能重新更新你的 *.fla 文件,我最终在一个 404 站点【参考方案2】:

如果您检测在侦听器函数中按下了哪个按钮会更好。

【讨论】:

例如如果每个单元格是按钮时是网格,您可以从鼠标指针坐标找到按钮。

以上是关于AS2 计算中 eval() 的最佳替代品的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 最佳替代品 - AlmaLinux Beta 已可供下载测试

什么是谷歌地图的最佳完全免费替代品

使用 ENSURE 避免代码分析警告的最佳替代方法是啥?

多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案

重磅!8/6宣停,来试试这些最佳替代方案吧!

AlmaLinux:CentOS的最佳替代