【小程序】eval被禁,代替方法

本文介绍了一款小程序计算器因eval方法被禁用而遇到的问题,并提供了解决方案,即使用rpn.js中的calCommonExp(str)方法来替代eval(str),确保计算器功能正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写的计算器小程序

这里写图片描述

昨天发现不好用了
调试下发现竟然报错说eval不能用了:

eval is not a function

这里写图片描述
原来eval方法被小程序禁掉了。


解决方法:
引入rpn.js 用里面的 calCommonExp(str)方法代替原来的eval(str)

rpn的github:
https://github.com/huruji/rpn.js

在小程序对应的js中,引入rpn:

这里写图片描述

注意,rpn.js想要模块化引入,需要我们手动修改下rpn.js的源码,在尾部把calCommonExp方法export出去方便外部引用:

module.exports = {
  calCommonExp: calCommonExp
}

这样直接调用rpn.calCommonExp()就可以完全代替原来eval()的位置。


rpn.js源码如下,万一你访问不了gayhub,我这有一份改完的:

function isOperator(value) {
    var operatorString = '+-*/()×÷';
    return operatorString.indexOf(value) > -1;
}

function getPrioraty(value) {
    if(value == '-' || value == '+') {
        return 1;
    } else if(value == '*' || value == '/' || value == '×' || value == '÷' ) {
        return 2;
    } else{
        return 0;
    }
}

function prioraty(v1, v2) {
    return getPrioraty(v1) <= getPrioraty(v2);
}

function outputRpn(exp) {
    var inputStack = [];
    var outputStack = [];
    var outputQueue = [];
    var firstIsOperator = false;
    exp.replace(/\s/g,'');
    if(isOperator(exp[0])){
        exp = exp.substring(1);
        firstIsOperator = true;
    }
    for(var i = 0, max = exp.length; i < max; i++) {
        if(!isOperator(exp[i]) && !isOperator(exp[i-1]) && (i != 0)) {
            inputStack[inputStack.length-1] = inputStack[inputStack.length-1] + exp[i] + '';
        } else {
            inputStack.push(exp[i]);
        }
    }
    if(firstIsOperator) {
        inputStack[0] = -inputStack[0] 
    }
    while(inputStack.length > 0) {
        var cur = inputStack.shift();
        if(isOperator(cur)) {
            if (cur == '(') {
                outputStack.push(cur);
            } else if (cur == ')') {
                var po = outputStack.pop();
                while(po != '(' && outputStack.length > 0) {
                    outputQueue.push(po);
                    po = outputStack.pop();
                }
            } else {
                while(prioraty(cur,outputStack[outputStack.length - 1]) && outputStack.length > 0) {
                    outputQueue.push(outputStack.pop());
                }
                outputStack.push(cur)
            }
        } else {
            outputQueue.push(Number(cur));
        }
    }
    if(outputStack.length > 0){
        while (outputStack.length > 0) {
            outputQueue.push(outputStack.pop());
        }
    }
    return outputQueue;
}

function calRpnExp(rpnArr) {
    var stack = [];
    for(var i = 0, max = rpnArr.length; i < max; i++) {
        if(!isOperator(rpnArr[i])) {
            stack.push(rpnArr[i]);
        } else {
            var num1 = stack.pop();
            var num2 = stack.pop();
            if(rpnArr[i] == '-') {
                var num = num2 - num1;
            } else if(rpnArr[i] == '+') {
                var num = num2 + num1;
            } else if(rpnArr[i] == '*' || rpnArr[i] == '×') {
                var num = num2 * num1;
            } else if(rpnArr[i] == '/' || rpnArr[i] == '÷') {
                var num = num2/num1;
            }
            stack.push(num);
        }
    }
    return stack[0];
}

function calCommonExp(exp) {
    var rpnArr = outputRpn(exp);
    return calRpnExp(rpnArr)
}

//已经添加完export,在外面直接调用
module.exports = {
  calCommonExp: calCommonExp
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值