# eval的参数与返回
- 接收String,执行string中的语句并返回结果
- 接收对象,原封不动地返回对象
# eval的作用域和变量提升
- 在非严格模式中
eval中使用var和function不会造成变量提升,但与外部使用同一个作用域。
eval中使用let和const,在eval内部具有独立的作用域,外部无权访问内部变量。
- 在严格模式中
- eval中使用var、function也会在eval内部创建独立的作用域,外部无权访问。
# eval的其他使用场景
模仿JSON.parse
function jsonParse(obj){
return eval("(" + obj + ")");
}
# 永远都不要使用eval
eval() 是一个危险的函数, 它使用与调用者相同的权限执行代码。如果 eval() 运行的字符串代码被恶意方修改,最终可能在用户计算机上运行恶意代码。
而使用Function是安全的(Function也可以传入字符串,并执行),上面的例子可以改造为
模仿JSON.parse
function jsonParse(obj){
return Function('"use strict";return (' + obj + ')')();
}
# eval执行更慢
eval的解析执行走js解释器,不走Js引擎,没有得到优化。