开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情
作用
这个方法就是一个完整的 ECMAScript 解释器,它接收一个参数,即一个要执行的 ECMAScript(JavaScript)字符串,然后就会执行这个字符串所表示的语句。
在严格模式下,将一些东西赋值给 eval ,企图覆盖系统自带的eval函数也会导致错误
在eval中定义变量的来龙去脉
当然在非严格模式下该函数内部定义的函数也可以在外部直接使用。在严格模式下就不行了。
而变量的话只有使用var定义的且在严格模式下【非严格模式下不行】才可以在外部进行访问。
原理
var他是直接挂载到全局上下文对应的变量对象上了,而let它本身是无法直接挂载到变量对象上的。虽然在外部作用域链解析结果是一样的,但是在eval内部还是有区别的。
由于代码中let定义的变量是在字符串中,他并没有被解析到当前上下文中。而var他是直接挂载到变量对象上了,哪怕他是在字符串中,但挂载了就是挂载了。是消失不掉的。所以外部是能访问的。
注意
通过 eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在一个字符串中的。它们只是在 eval()执行的时候才会被创建。
上下文
通过该函数执行的语句的上下文是eval语句所处的上下文。
COOKBOOK
由于该语法本身就是一个解释器,所以注定了该语法十分低效,而且由于他执行的代码是被块所包裹的,所以let、const变量是无法从块中渗透出去的。 所以若是使用该函数封装接口的话,在使用时容易出现意想不到且难以查询的错误。
句末语
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情