eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。
上面代码将字符串当作语句运行,生成了变量a。
如果参数字符串无法当作语句运行,那么就会报错。
放在eval中的字符串,应该有独自存在的意义,不能用来与eval以外的命令配合使用。举例来说,下面的代码将会报错。
上面代码会报错,因为return不能单独使用,必须在函数中使用。
如果eval的参数不是字符串,那么会原样返回。
eval没有自己的作用域,都在当前作用域内执行,因此可能会修改当前作用域的变量的值,造成安全问题。
上面代码中,eval命令修改了外部变量a的值。由于这个原因,eval有安全风险。
为了防止这种风险,JavaScript 规定,如果使用严格模式,eval内部声明的变量,不会影响到外部作用域。
上面代码中,函数f内部是严格模式,这时eval内部声明的foo变量,就不会影响到外部。
不过,即使在严格模式下,eval依然可以读写当前作用域的变量。
上面代码中,严格模式下,eval内部还是改写了外部变量,可见安全风险依然存在。
总之,eval的本质是在当前作用域之中,注入代码。由于安全风险和不利于 JavaScript 引擎优化执行速度,一般不推荐使用。通常情况下,eval最常见的场合是解析 JSON 数据的字符串,不过正确的做法应该是使用原生的JSON.parse方法。
以上就是我的分享,新手上道,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!
因篇幅问题不能全部显示,请点此查看更多更全内容