我试图发现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:找不到变量:链接
有人知道为什么会这样吗,以及如何解决它吗?
感谢您的帮助。
答案 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>