如下图是在Chrome中得到的:
问题:
首先,str代表的是一个json字符串,这点应该是没疑问的,然后我运行eval('({"ok":"true"})')
就返回了{ok: "true"}
,这里面是怎么实现的?是去看别人写的项目的源码中看到的,不明所以,请赐教~
如下图是在Chrome中得到的:
问题:
首先,str代表的是一个json字符串,这点应该是没疑问的,然后我运行eval('({"ok":"true"})')
就返回了{ok: "true"}
,这里面是怎么实现的?是去看别人写的项目的源码中看到的,不明所以,请赐教~
避免在不必要的情况下使用 eval
eval() 是一个危险的函数, 他执行的代码拥有着执行者的权利。如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)操控修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。更重要的是,第三方代码可以看到某一个eval()被调用时的作用域,这也有可能导致一些不同方式的攻击。相似的 Function 就不容易被攻击。eval() 通常比替代方法慢,因为它必须调用 JS 解释器,而许多其他结构则由现代 JS 引擎进行优化。
在常见的案例中我们都会找更安全或者更快的方案去替换 eval()
eval() -- 你就想象成写了一段代码给浏览器解析,性质是一样的
如 let str = 'x={"ok":"true"}'; eval(str); 执行之后 会在当前作用域中创建一个x的变量 赋值为 {ok:'true'}
你上面的例子 eval('(' + str + ')'); <==> 等价于直接在浏览器中写了一个 {ok:'true'}
由于不是合格的表达式,eval中在两边加了括号
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答4.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答4.9k 阅读✓ 已解决
3 回答3.7k 阅读✓ 已解决
eval
函数接受字符串,然后把这个字符串当作js
代码去运行,返回运行的结果。相当于运行
返回对象
{ok: "true"}
。个人觉得需要注意的点是两边为什么要加括号?
因为
{}
不仅可以用来声明对象,还表示块级作用域,如果两边不加括号,会把
{}
当成块级作用域解析,就会报语法错误;加上括号,会把
{}
当作对象声明处理,所以就会生成一个新的对象,不会报语法错误。