这段代码
eval(`
let a = 0;
function f() {}
function g() { a; }
console.log(f);
`);
在 Firefox 48.0 上运行良好,但在 Google Chrome 52.0.2743.116(64 位)上导致 Uncaught ReferenceError: f is not defined
。
它在谷歌浏览器上也能正常工作
eval
未使用,或者eval
中的代码被{}
包围,或者a
未在g
中引用,或者let
改为var
,或者在代码前加上“use strict”
这里发生了什么?
最佳答案
调整你的例子你可以看到发生了什么,虽然命令有点矛盾,但它看起来像一个错误。将 a 定义为函数并记录它而不是 f,然后查看控制台。您会看到使用 a、f 和 g 创建了一个闭包。由于 a 在 g 中被引用,并且 f 和 g 应该对彼此可见,所以这有点道理。但是 eval 在全局范围内工作。所以当你试图访问它们时,你会得到未定义的。就好像这个闭包无法从任何地方访问。
尝试:
eval('let a = function(){}; function f() {};function g(){a;};console.dir(a);');
您将在控制台中看到:
<function scope>
Closure
a: function()
f: function f()
g: function g()
您所有的其他情况都使情况更清楚,并防止了问题:
- 未使用 eval:范围不匹配不太明显,
- eval 中的代码用 {} 包围:变量是链接的 通过 block 范围。
- a 未在 g 中引用:如果变量 没有链接。
- let 改为var:全局范围内的var定义在 全局范围。所以不需要关闭
- 代码前加“use strict”:use strict in eval prevents 要添加到全局范围的变量,因此再次“更容易” 处理。 let 需要与全局函数链接之间没有不匹配。
关于javascript - Google Chrome 上的 ReferenceError 但 Firefox 上没有(浏览器错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38921993/