在for循环(safari)内的简单函数中找不到变量

时间:2019-11-05 09:45:01

标签: javascript safari

我试图发现Safari为什么返回控制台错误,而其他浏览器(例如Chrome)却没有问题。在for循环中有一个简单的函数,如下所示:

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

在野生动物园中打开上述可待因网址,然后打开您的JavaScript控制台。如您所见,在Safari中,功能logLink();似乎没有记录链接变量,尽管它在Chrome中有效。

我得到的错误是:ReferenceError:找不到变量:链接

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

函数声明的范围仅限于在内部声明并提升的函数(因此,它位于for循环的 outside 外),但是const声明的范围仅限于包含 block < / em>。

link仅存在于块内部,logLink位于块外部,因此logLink无权访问link常量。

使用函数表达式和const,使函数的作用域位于link常量之类的for循环块中。

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>