JavaScript之Function替代eval
起因
对于数组传入到数据库中,会以字符串的形式返回,那样前端组件在利用值的时候会匹配不上,需要将其转回数组。
例如: let a = "['a', b, c, 1, 2]"
转换: eval('(' + a + ')')
则可将a转换成数组
eval到底做了什么?
eval
eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
返回字符串中代码的返回值。如果返回值为空,则返回 undefined。
永远不要使用 eval!
eval() 是一个危险
的函数, 它使用与调用者相同的权限执行代码。
如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。
更重要的是,第三方代码可以看到某一个 eval() 被调用时的作用域,这也有可能导致一些不同方式的攻击。
eval替代方法
使用eval的糟糕代码:
1
2
3
4
5
6function looseJsonParse(obj){
return eval("(" + obj + ")");
}
console.log(looseJsonParse(
"{a:(4-1), b:function(){}, c:new Date()}"
))不用eval的更好的代码:
1
2
3
4
5
6function looseJsonParse(obj){
return Function('"use strict";return (' + obj + ')')();
}
console.log(looseJsonParse(
"{a:(4-1), b:function(){}, c:new Date()}"
))
只需使用 window.Function
Function
Function 构造函数创建一个新的 Function 对象。
直接调用此构造函数可用动态创建函数,但会遇到和 eval 类似的的安全问题和(相对较小的)性能问题。
然而,与 eval 不同的是,Function 创建的函数只能在全局作用域中运行。
语法
new Function ([arg1[, arg2[, ...argN]],] functionBody)
参数
- arg1, arg2, … argN
被函数使用的参数的名称必须是合法命名的。参数名称是一个有效的JavaScript标识符的字符串,或者一个用逗号分隔的有效字符串的列表;例如“×”,“theValue”,或“a,b”。 - functionBody
一个含有包括函数定义的 JavaScript 语句的字符串。
例子:1
2
3
4const sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 6));
// expected output: 8
找到了eval更好的替代方法!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随心所欲录!
评论