"new Function" 如何计算一串数字符号并产生结果?这种类型的函数声明通常如何工作?
How does the "new Function" calculate a string of numeric signs and produce the result? How does this type of function declaration work in general?
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
}())
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
}())