将代码放入文件(test.js)中,然后执行node test.js
。您会得到:
ReferenceError:未定义val
如果直接在节点环境(或浏览器控制台)中复制代码,则不会报告错误。
let val = "global"
function foo2() {
let val = "local"
let f = eval
return f("val")
}
foo2()
答案 0 :(得分:3)
如果您通读MDN page on eval
,则会看到:
如果您通过eval以外的其他引用调用eval函数来间接使用eval函数,则从ECMAScript 5开始,它将在全局范围而不是局部范围内工作。
当您在Node中运行此代码时,它将在val
的全局对象上查找,并且找不到它,因为即使在外部作用域上声明的变量对于Node中的封闭模块也是私有的-它们不会除非将它们放置在全局名称空间中,否则它们不会终止。这将导致您注意到的错误。
但是,这会将global
登录到节点:
global['val'] = "global"
function foo2() {
let val = "local"
let f = eval
return f("val")
}
console.log(foo2())