javascript - Google Chrome 上的 ReferenceError 但 Firefox 上没有(浏览器错误?)

标签 javascript google-chrome referenceerror

这段代码

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/

相关文章:

javascript - 在这种情况下,如何通过第一次点击 jquery 初始化第二次点击?

javascript - Chrome 中未删除 session cookie 的解决方法

javascript - Chrome 地理定位不适用于任何网站

javascript - Uncaught ReferenceError : $ is not defined?

javascript - socket.io - 引用错误 : io is not defined

javascript - 图像高度和宽度自动?

javascript - 使用 javascript 控制台检查 javascript 对象

javascript - 如何将网页快照及其所有元素(css、js、图像等)保存到一个文件中

chrome 上的 Jquery .css 问题

Safari 中的 Javascript FileReader 检测