学习
实践
活动
专区
工具
TVP
写文章

深入了解 Eval

Eval:运行一个代码字符串

内置的eval函数允许执行一串代码。

语法是:

例子:

一个代码串可以很长,包含换行符、函数声明、变量等等。

eval的结果是最后一条语句的结果。

例如:

eval的代码是在当前的词法环境中执行的,所以它可以看到外部变量:

它也可以改变外部变量:

在严格模式下,eval有自己的词法环境。因此,在eval内部声明的函数和变量在外部不可见:

如果不使用strict, eval就没有自己的词法环境,所以我们会在外面看到x和f。

使用 eval

在现代编程中,eval的使用非常少。人们常说“eval是邪恶的”。

原因很简单:很久很久以前,JavaScript是一门弱得多的语言,许多事情只能用eval来完成。但十年前,这段时间就过去了。

现在,几乎没有理由使用eval。如果有人正在使用它,他们很有可能用一个现代的语言结构或JavaScript模块来替换它。

请注意,它访问外部变量的能力有副作用。

将局部变量重命名为更短的变量(如a、b等),以使代码更小。这通常是安全的,但如果使用eval,则不是,因为局部变量可以从eval的代码字符串访问。因此,minifier不会对eval中可能可见的所有变量进行重命名。这对代码压缩比有负面影响。

在eval中使用外部局部变量也被认为是一种糟糕的编程实践,因为它使维护代码变得更加困难。

有两种方法可以完全避免这些问题。

如果eval的代码不使用外部变量,请调用eval作为window.eval(…):

这样代码就会在全局作用域中执行:

如果eval代码需要局部变量,将eval改为new Function并将它们作为参数传递:

新函数的构造将在“新函数”语法一章中解释。它从一个字符串创建一个函数,这个字符串也在全局范围内。所以它看不到局部变量。但是,像上面的例子那样,将它们显式地作为参数传递要清楚得多。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210313A01W7P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券