eval跟new Function的区别是什么?是否有共同点?


eval() 函数会将传入的字符串当做 JavaScript 代码进行执行

console.log(eval('2 + 2'));// 4
let p = 1;
let aa = eval('(function a(){console.log("eval定义的函数",p)})()');
console.log(aa);// "eval定义的函数" 1


建议在nodejs模式下执行,浏览器会报安全问题!
入参只有一个,是string类型:
一个表示 JavaScript 表达式、语句或一系列语句的字符串。表达式可以包含变量与已存在对象的属性

new Function 每个 JavaScript 函数实际上都是一个 Function 对象。运行 (function(){}).constructor === Function // true 便可以得到这个结论。

由 Function 构造函数创建的函数不会创建当前环境的闭包,它们总是被创建于全局环境,因此在运行时它们只能访问全局变量和自己的局部变量,不能访问它们被 Function 构造函数创建时所在的作用域的变量。这一点与使用 eval() 执行创建函数的代码不同。

需要在浏览器上运行,在nodejs上运行的结果是不一样的

var x = 10;
function createFunction1() {
    var x = 20;
    return new Function('return x;'); // 这里的 x 指向最上面全局作用域内的 x
}
var f1 = createFunction1();
console.log(f1());// 10

nodejs中是无法读取到new Function外声明的变量的,因为Node.js 中 f1() 会产生一个“找不到变量 x”的 ReferenceError。这是因为在 Node 中顶级作用域不是全局作用域,而 x 其实是在当前模块的作用域之中。

eval和new Function在浏览器上运行时都存在安全风险,因为浏览器无法感知你里面的字符串是否安全!

永远不要使用 eval!底层实现的库一般都是使用new Function的形式

eval() 是一个危险的函数, 它使用与调用者相同的权限执行代码。如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。更重要的是,第三方代码可以看到某一个 eval() 被调用时的作用域,这也有可能导致一些不同方式的攻击。相似的 Function 就不容易被攻击。

eval() 通常比其他替代方法更慢,因为它必须调用 JS 解释器,而许多其他结构则可被现代 JS 引擎进行优化。

此外,现代JavaScript解释器将javascript转换为机器代码。 这意味着任何变量命名的概念都会被删除。 因此,任意一个eval的使用都会强制浏览器进行冗长的变量名称查找,以确定变量在机器代码中的位置并设置其值。 另外,新内容将会通过 eval() 引进给变量, 比如更改该变量的类型,因此会强制浏览器重新执行所有已经生成的机器代码以进行补偿。 但是,(谢天谢地)存在一个非常好的eval替代方法:只需使用 window.Function。 这有个例子方便你了解如何将eval()的使用转变为Function()

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: `eval()` 是 Python 内置函数之一,用于将字符串作为 Python 表达式进行求值,并返回结果。它将字符串作为参数,执行其中的 Python 代码,并返回代码执行后得到的结果。 例如,如果我们想要执行一个简单的加法操作,可以将加法表达式作为字符串传递给 `eval()` 函数: ```python result = eval('2 + 3') print(result) # 输出 5 ``` `eval()` 函数还可以用于执行包含变量、函数等的表达式。但是,由于 `eval()` 可以执行任意代码,因此在使用时应该非常小心,确保不会执行来自不可信源的代码。由于它可以执行任意代码,因此存在潜在的安全风险。 ### 回答2: Python的eval()函数是将字符串作为Python表达式进行求值的一个内置函数。它接受一个字符串参数,并按照Python解释器的规则对其进行求值。eval()函数主要用于动态执行Python代码。 eval()函数可以执行简单的算术运算,例如将字符串"1 + 2"传递给eval()函数,它将返回整数3。它也可以执行其他复杂的操作,如调用函数、访问变量等等。通过将字符串作为参数传递给eval()函数,可以在运行时动态生成代码并执行。 然而,需要注意的是eval()函数的使用需要谨慎,特别是当接受的字符串来自不可信的来源时。因为eval()函数可以执行任意的Python代码,如果不加限制地使用eval()函数,可能会存在安全风险,如执行恶意代码或者导致意外的副作用。 总之,eval()函数是Python中一个强大而灵活的工具,可以将字符串转换为可执行的代码并进行求值,但在使用时需要注意安全问题。 ### 回答3: Python的`eval()`函数是一个内置函数,用于将字符串作为代码执行,并返回执行结果。它主要用于计算简单的数学表达式、执行动态生成的代码和将字符串转换为其表达式或变量的值。 当我们需要将一个字符串看作是可执行的代码时,可以使用`eval()`函数。它会评估字符串中的表达式,执行这些表达式,并返回结果。这使得我们可以在运行时动态地执行代码。例如: ``` result = eval("3 + 5") print(result) # 输出: 8 ``` `eval()`函数还可以执行更复杂的表达式,包括函数调用和条件语句。例如: ``` num = 10 statement = "num * 2 if num > 5 else num * 3" result = eval(statement) print(result) # 当num为10时,输出: 20 ``` 需要注意的是,`eval()`函数强制执行所提供的字符串,这可能带来安全风险。如果我们不信任输入的字符串来源,应该避免使用`eval()`函数,以防止执行恶意代码。 总之,`eval()`函数在Python中允许我们动态执行字符串表达式,帮助我们实现更灵活和动态的编程。然而,出于安全考虑,在使用时需要谨慎评估所提供的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值