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

之前写的计算器小程序

这里写图片描述

昨天发现不好用了
调试下发现竟然报错说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
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 微信小程序中的eval函数已经被禁用,不能直接使用。eval函数在执行字符串时,可能会引起安全漏洞和代码注入等问题。为了保障小程序的安全性,微信官方决定禁用eval函数。 如果您在开发小程序时需要执行一些动态的代码,可以使用Function构造函数来代替eval函数。例如,下面的代码使用Function构造函数动态执行一个简单的加法运算: ``` var a = 1; var b = 2; var result = new Function('return ' + a + '+' + b + ';')(); console.log(result); // 3 ``` 需要注意的是,使用Function构造函数创建函数时,functionBody 参数必须是一个字符串,而不能是一个函数对象。同时,为了避免代码注入等安全问题,应该避免使用动态的代码字符串。 ### 回答2: 微信小程序 eval 是一个用于执行传入的 JavaScript 字符串的函数。它可以将字符串代码作为参数传入,然后动态地在小程序中执行代码并返回结果。eval 函数在一些特定场景下非常有用,例如在小程序中需要动态地生成代码并执行时。 eval 函数的使用方法很简单,只需要将需要执行的代码字符串作为参数传入即可。例如,我们可以使用 eval 函数来执行一个简单的加法运算: ```javascript var a = 10; var b = 20; var result = eval("a + b"); console.log(result); // 输出 30 ``` 在上面的例子中,我们将字符串 `"a + b"` 作为参数传入 eval 函数,并将返回的结果赋值给 result 变量。最后,我们使用 console.log 输出了结果。 需要注意的是,eval 函数的使用需要谨慎,尤其是在处理用户输入或者网络请求返回的动态代码时。由于 eval 函数会执行传入的字符串代码,如果不对传入的代码进行严格的验证和限制,可能会造成安全风险。攻击者可能利用 eval 函数来注入恶意代码,从而对用户隐私或者系统进行攻击。因此,在使用 eval 函数时应该遵循安全规范,并对传入的代码进行充分的验证和过滤。 总而言之,微信小程序eval 函数可以用于执行传入的字符串代码,并返回执行结果。它在一些特定场景下非常有用,但需要小心使用以避免安全风险。 ### 回答3: 微信小程序 eval 是一种开发工具,它主要用于对某一段 JavaScript 代码进行动态求值并返回结果。eval 函数接受一个字符串作为参数,这个字符串可以包含变量、函数、表达式等 JavaScript 代码。 使用 eval 函数可以实现动态化的功能,例如根据用户的输入动态执行不同的代码逻辑,实现个性化定制。同时,它可以用于处理一些动态生成的代码,如模板引擎、动态渲染等。 值得一提的是,由于 eval 函数的执行过程是在当前的作用域下执行的,如果在 eval 中定义了新的变量或函数,它们都将在 eval 函数执行结束后失效,不会对外部环境造成污染。 微信小程序 eval 还封装了一些安全处理机制,以防止恶意注入或代码劫持。例如,它只支持在小程序自身定义的函数中使用 eval 函数,禁止在外部引入的库或组件中使用 eval,从而保证了代码的安全性。 同时,开发者也需要注意 eval 的使用场景和使用方式。由于 eval 函数的执行效率较低,并且存在一些安全隐患,所以在开发过程中应尽量避免过度使用 eval 函数,以免影响程序的性能和安全性。在需要使用 eval 函数的情况下,可以通过其他方式来替代,如利用 JavaScript 的原生语法,或者使用其他适合的小程序 API。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值