let calc = '41+9-(30/2)*2';
let getResult = new Function(`return ${calc}`);
let omg = getResult();
console.log(omg); //20
我真的不明白它是如何工作的。是的,我知道通过这样的声明,一个函数只能访问全局变量。据我了解,这样的功能可以将任何字符串转换为代码。像“ eval”这样的东西吗?计算字符串并将其转换为数字类型的结果的机制是什么?
如果有人帮助我解决这个问题,我将非常感激。
这行之有效,因为我们已经处于全球范围内:
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
}())