相关文章推荐
爱健身的钥匙扣  ·  使用 ijkplayer ...·  8 月前    · 
含蓄的红薯  ·  SQL Server ...·  1 年前    · 
逆袭的圣诞树  ·  git ...·  1 年前    · 

今天有同事问我:“怎么解析一段字符串的 javascript 代码?”
“eval() 呀”
“我们的项目禁用 eval …”
“曹孟德的名字”

解析一段字符串的 javascript 代码的需求并不常见, 所以提到这个需求第一时间想到的方法毫无悬念就是 eval()
可是基于网络安全的种种原因, 很多项目对这个方法避之若浼

所以禁用 eval 时, 如何解析字符串的 javascript 代码呢?

这里有个取巧的方法, 就是插入一个 script 标签

function fun(a) {
	console.log(a);
// eval('fun("some data")')
var new_element = document.createElement('script');
new_element.innerHTML = 'fun("some data")';
document.body.appendChild(new_element);
document.body.removeChild(new_element);

demo 中新建一个 script 元素, 在元素中写入要解析的 javascript 代码, 把元素插入文档, 解析完毕把该元素移除

因为这里解析的 javascript 代码是个函数调用, 所以插入即执行完毕, 合理利用这个方法, 还可以达到传值的效果

利用 setTimeout 的第一个参数

function fun(a) {
	console.log(a);
setTimeout('fun("some data")', 0)

不过用到 setTimeout 就涉及事件流, 用的时候要先弄清楚写的代码的执行顺序

参考资料:AJAX - 廖雪峰的官方网站

关于被小程序禁止使用eval函数的问题,大家都多少了解了,新规则已经限制死了。请看下面新规则。既然要求如此严格,那么有没有其它解决方案呢,所谓上有正常,下有对策。故今天这篇文章就是要提供新的思路实现动态执行js代码的方案。... 这两天在翻阅《JavaScript模式》的候,看到一个标题,“避免使用eval()”,这不禁让我想探索一下,为什么要避免使用eval。 首先我们来先看一下eval()的定义: 执行一段字符串中的JavaScript代码eval(code) 包含待求知的JavaScript表达式或待执行的JavaScript语句的字符串。 求值后的代码的值,如果存在对应的值... 调试下发现竟然报错说eval不能用了:eval is not a function 原来eval方法被小程序禁掉了。解决方法: 引入rpn.js 用里面的 calCommonExp(str)方法代替原来的eval(str)rpn的github: https://github.com/huruji/rpn.js在小程序对应的js中,引入rpn:注意,rpn 转载地址:http://www.myhack58.com/Article/60/61/2014/50632.htmphp的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的。但是eval()对于php安全来说具有很大的杀伤力,因此一般不用的情况下为了防止类似如下的一句话木马入侵,需要禁止!<?php eval($_POST[cmd]... 无论是linux服务器还是windows服务器,eval命令是非常危险的 一、如何禁用eval命令 在php.ini中这样设置disable_functions =eval是无法禁用eval的,根据php手册说明,eval是一个语言构造器而不是一个函数。如果要禁用eval,则需要第三方扩展,使用Suhosin linux下suhosin的安装: wg... 在 js 的学习过程中,经常会看到 不推荐使用 eval,甚至将 eval 比为 evil(恶魔)。本人也是觉得,如果没有十足的必要,就不要用 evaleval 的作用是能够将一段 js 字符串变成可执行的 js 代码,与此有类似功能的还有:Function、setInterval、setTimeout。不建议使用 eval 的理由有以下几点: 1. eval 不容易调试: 网上好多说使用disable_functions禁止掉eval 是错误的 其实eval() 是无法用php.ini中的disable_functions禁止掉的  because eval() is a language construct and not a function 用replace可以,但是只会替代第一个字符var mac = "3C:A3:08:B5:09:2E"mac.replace(":","")//console.log --- 3CA3:08:B5:09:2E我们用正则表达式里面的 /g,就可以全部替代了var mac = "3C:A3:08:B5:09:2E"mac.replace(/:/g,"")//console.log --- 3CA308B function eval1 (str) { var script = document.createElement('script'); script.type="text/javascript"; script.text=str; document.getElementsByTagName('head')[0].appendChild(script);