JS学习(20)eval

156 阅读2分钟

前言

  • Javascript中的eval方法是啥?一般什么场景下使用?

eval的基本用法

eval()函数接收一个字符串作为参数,该字符串一个表示JavaScript表达式、语句或一系列语句的字符串。表达式可以包含变量与已存在对象的属性。

eval('console.log("hello world")')
// hello world

如果eval()的参数不是字符串,eval()会将参数原封不动地退返回。例如:

console.log(eval(true)) // true
console.log(eval(3)) // 3

如果传入的字符串不是JavaScript代码,那么也会将此字符串原封不动的返回。例如:

var a = 5
console.log(eval(a)) // 5

eval作用域

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

let a = 1
function test() {
    let a = 2
    eval('console.log(a)')
}
test() // 2

它也可以改变外部变量:

let a = 1
eval('a = 2')
console.log(a) // 2

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

"use strict";
eval('var a = 2')

console.log(a) // ReferenceError: a is not defined

如果没有use strict,eval没有自己的词法环境,所以我们会在外面看到a

eval('var a = 2')

console.log(a) // 2

永远不要使用eval

a. 安全风险:如果 eval() 执行的字符串包含来自不可信来源的数据,可能会导致注入攻击。

b. 性能问题:eval() 会导致性能下降,因为它需要调用 JavaScript 解释器。

c. 调试困难:由于代码是动态生成的,使用 eval() 的代码通常很难调试。

d. 作用域问题:在严格模式下,eval() 有自己的作用域,这可能会导致一些意外的行为。

e. 可读性差:使用 eval() 的代码通常难以理解和维护。

总结

  • Javascript中的eval方法是啥?一般什么场景下使用?

eval是JavaScript中的一个全局函数,它将指定的字符串计算为JavaSccript代码并执行它。

在现代JavaScript编程中,我们应该尽量避免使用eval,之前所有使用eval的地方都有更好的方式来进行代替,所以在现代JavaScript编程中,eval没有什么使用场景存在,也就是说,并不存在某些场景必须要使用eval才能实现的。

a. 动态生成代码:在某些情况下,可能需要根据运行时的条件动态生成并执行代码。(使用 Function 构造函数替代)

b. 解析 JSON 数据:在不支持 JSON.parse() 的旧版本浏览器中,可以使用 eval() 来解析 JSON 字符串。(使用 JSON.parse() 解析 JSON 数据)