【小程序】eval被禁,代替方法
来源:互联网 发布:php从入门到精通 光盘 编辑:程序博客网 时间:2024/06/09 23:43
之前写的计算器小程序
昨天发现不好用了
调试下发现竟然报错说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}
阅读全文
0 0
- 【小程序】eval被禁,代替方法
- Js 代替eval的方法
- 使用标准数据绑定语法代替 DataBinder.Eval 方法以提高性能
- eval 方法
- eval 方法
- Eval 方法
- 程序中的小方法
- JScript方法-eval方法
- eval防止程序崩溃
- DataBinder.Eval方法
- DataBinder.Eval方法研究
- DataBinder.Eval方法研究
- Eval 绑定方法
- 揭秘Eval方法
- DataBinder.Eval 方法
- DataBinder.Eval方法研究
- java重写eval方法
- DataBinder.Eval方法研究
- HTML5权威指南笔记:16-理解CSS(内容简介)
- RView
- 微服务架构下,如何实现分布式跟踪?
- 【BigHereo 38】---L11---C++错题总结
- 网络获取视屏播放
- 【小程序】eval被禁,代替方法
- Swift4.0 strtoul、strtod、strtof、strtol等字符串函数的改变
- 10/21 IP 与 GATEWAY
- 100G光模块之后,200G,400G谁将成为市场宠儿
- gouwucheITEM
- php开发微信
- 根据文件路径、commit id、 批量获取patch
- p60-4.3(1)
- GridSearchCV