eval被间接调用,但是会得到一个错误

时间:2018-12-26 08:48:03

标签: javascript eval

将代码放入文件(test.js)中,然后执行node test.js。您会得到:

  

ReferenceError:未定义val

如果直接在节点环境(或浏览器控制台)中复制代码,则不会报告错误。

let val = "global"

function foo2() {
    let val = "local"
    let f = eval
    return f("val")
}
foo2()

1 个答案:

答案 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())
相关问题