“新功能”如何计算一串数字符号并产生结果?这种类型的函数声明一般如何工作?

问题描述 投票:0回答:1

let calc = '41+9-(30/2)*2';
let getResult = new Function(`return ${calc}`);
let omg = getResult();

console.log(omg); //20

我真的不明白它是如何工作的。是的,我知道通过这样的声明,一个函数只能访问全局变量。据我了解,这样的功能可以将任何字符串转换为代码。像“ eval”这样的东西吗?计算字符串并将其转换为数字类型的结果的机制是什么?

如果有人帮助我解决这个问题,我将非常感激。

javascript functional-programming new-operator
1个回答
0
投票

这行之有效,因为我们已经处于全球范围内:

let x = 'foo'
let f = new Function(`return x`)
let result = f()
console.log(result) // 'foo'

这不起作用,因为我们不在全局范围内:

(function () {
    let x = 'foo'
    let f = new Function(`return x`)
    let result = f()
    console.log(result) // ReferenceError: x is not defined
}())

但是,您的代码有所不同,因为字符串x被插值到字符串模板中。...然后提供给Function构造函数。因此,函数体未关闭x

函数体从字面上是return 41+9-(30/2)*2,将对其求值并返回结果。

所以无论上下文如何,您的代码仍然可以使用:

(function() {
    let x = '41+9-(30/2)*2';
    let f = new Function(`return ${x}`);
    let result = f();
    console.log(result); //20
}())
© www.soinside.com 2019 - 2024. All rights reserved.