Javascript eval被间接调用,但得到一个错误
将代码放入文件(test.js),然后执行Javascript eval被间接调用,但得到一个错误,javascript,eval,Javascript,Eval,将代码放入文件(test.js),然后执行node test.js。您将获得: ReferenceError:未定义val 如果直接在节点环境(或浏览器控制台)中复制代码,则不会报告错误 let val = "global" function foo2() { let val = "local" let f = eval return f("val") } foo2() 如果通读MDN,您将看到: 如果间接使用eval函数,则从ECMAScript 5开始,通过eva
node test.js
。您将获得:
ReferenceError:未定义val
如果直接在节点环境(或浏览器控制台)中复制代码,则不会报告错误
let val = "global"
function foo2() {
let val = "local"
let f = eval
return f("val")
}
foo2()
如果通读MDN,您将看到: 如果间接使用eval函数,则从ECMAScript 5开始,通过eval以外的引用调用该函数,它将在全局范围而不是本地范围内工作 当您在节点中运行此代码时,它将在全局对象上查找
val
,但找不到它,因为即使在外部范围中声明的变量对节点中的封闭模块也是私有的-除非您将它们放在那里,否则它们不会在全局命名空间中结束。这会导致您注意到的错误
但是,这将在节点中记录global
:
global['val'] = "global"
function foo2() {
let val = "local"
let f = eval
return f("val")
}
console.log(foo2())
“local”不构成代码,它只是一个字符串。“eval()函数对表示为字符串的JavaScript代码求值。”但为什么它只在显式地将其放入
global
而不是let val
时才起作用?@Dmitry因为节点中的所有内容都在一个模块中。除非显式地将变量放在全局范围内,否则变量不会在全局范围内结束。(我不建议这样做),但您也可以分配一个变量,不使用let
或var
,它也将是全局变量(上面的间接评估也会起作用)。有一个很好的讨论,所以问题是val
是test
模块的本地部分,eval
在全局范围内运行,因为它是间接使用的。你能把这个加在你的答案上以便更好地解释吗?