【问题标题】:Cannot find variable in a simple function inside a for of loop (safari)在 for of 循环内的简单函数中找不到变量(safari)
【发布时间】:2020-03-01 15:53:43
【问题描述】:

我试图找出为什么 Safari 返回控制台错误而其他浏览器(如 Chrome)没有问题。 for of 循环中有一个简单的函数如下:

const links = document.querySelectorAll('ul > li > a');

console.log(links); // successful

for (const link of links) {
    console.log(link); // successful
  
  function logLink() {
    console.log(link);
  }
  
  logLink();
}
<ul id='test'>
  <li>
    <a class='one' href='#'>test 1</a>
  </li>
  <li>
    <a class='two' href='#'>test 2</a>
  </li>
  <li>
    <a class='three' href='#'>test 3</a>
  </li>
</ul>

Codepen:https://codepen.io/ns91/pen/oNNEKpP

在 safari 中打开上述可待因 URL 并打开您的 javascript 控制台。如您所见,在 Safari 中,函数 logLink(); 似乎没有记录链接变量,尽管它在 Chrome 中有效。

我得到的错误是:ReferenceError: Can't find variable: link

有谁知道为什么会这样,以及如何解决?

感谢您的帮助。

【问题讨论】:

    标签: javascript safari


    【解决方案1】:

    函数声明的范围仅限于它们在内部声明和提升的函数(因此它在 for 循环块的 外部)但 const 声明的范围仅限于包含 .

    link 只存在于块内部,logLink 存在于块外部,因此logLink 无法访问link 常量。

    使用函数表达式和const,这样函数的作用域就在for循环的块中,就像link常量一样。

    const links = document.querySelectorAll('ul > li > a');
    for (const link of links) {
      const logLink = function logLink() {
        console.log(link);
      }
      logLink();
    }
    <ul id='test'>
      <li>
        <a class='one' href='#'>test 1</a>
      </li>
      <li>
        <a class='two' href='#'>test 2</a>
      </li>
      <li>
        <a class='three' href='#'>test 3</a>
      </li>
    </ul>

    【讨论】:

    • 谢谢 - 我不明白你是如何让它工作的,因为它可以在其他浏览器中工作,并且链接变量应该已经可用,因为它是在上述范围内使用 for of 循环定义的跨度>
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2018-04-25
    • 2021-03-16
    • 2020-10-13
    • 2020-10-14
    • 2018-03-14
    相关资源
    最近更新 更多