Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript eval被间接调用,但得到一个错误_Javascript_Eval - Fatal编程技术网

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

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

将代码放入文件(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开始,通过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
在全局范围内运行,因为它是间接使用的。你能把这个加在你的答案上以便更好地解释吗?