let calc = '41+9-(30/2)*2';
let getResult = new Function(`return ${calc}`);
let omg = getResult();
console.log(omg); //20
我真的不明白它是怎么工作的。是的,我知道有了这样的声明,函数只能访问全局变量。据我所知,这样的函数可以将任何字符串转换为代码。那么它是不是类似于">eval"?计算字符串并将其转换为数字类型的结果的机制是什么?
如果有人帮我解决这个问题,我会非常感激
以下代码之所以有效,是因为我们已经处于全局上下文中:
const x = 'foo'
const f = new Function(`return x`)
const result = f()
console.log(result) // 'foo'
以下代码不起作用,因为我们不在全局上下文中:
(function () {
const x = 'foo'
const f = new Function(`return x`)
const result = f()
console.log(result) // ReferenceError: x is not defined
}())
但是,您的代码完全不同。字符串x
被替换为模板文字,然后将完成的字符串提供给Function
构造函数。因此函数体不会在x
上闭合。函数体实际上是return 41+9-(30/2)*2
,对其进行求值并返回结果。
因此,无论上下文如何,您的代码都可以工作:
(function() {
const x = '41+9-(30/2)*2'
const f = new Function(`return ${x}`)
const result = f()
console.log(result) //20
}())