javascript - ES6 for 循环 let 改 var 作用域出错如何解决?
PHPz
PHPz 2017-04-10 18:10:30
[JavaScript讨论组]




    
    Document
    



    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

< >

上面是全部代码,其中第一个for循环处:

/*slider navigator dots*/
for (let /*在这里*/ i = 0; i < sliderNavs.length; i++) {
    sliderNavs[i].onmouseover = function() {
        if (timer) clearInterval(timer);
        changeImg(i);
    };

如果改为let 则不会报错,如果是var 则出现如下错误:

3js轮播3.html:162 Uncaught TypeError: Cannot read property 'style' of undefined

请问为了改为var而不是let,我应该如果修改代码?

PHPz
PHPz

学习是最好的投资!

全部回复(4)
伊谢尔伦

因为使用let定义的变量只在当前的块级作用域有效,所以,使用let就能够避免你的for循环的函数在循环结束之后执行。但是,使用var就不同了。使用var定义的变量,是不存在块级作用域的。所以,当你使用var的时候,其实循环已经执行完了,你的i的值就是sliderNavs.length,当然就会报错。所以,你需要一个闭包来保存i的值。

所以,把你的for循环的代码改成这样:

/*slider navigator dots*/
for (var i = 0; i < sliderNavs.length; i++) {
    (function ( i ) {
        sliderNavs[i].onmouseover = function() {
            if (timer) clearInterval(timer);
            changeImg(i);
        };

        sliderNavs[i].onmouseout = function() {
            autoChange(currentPoint);
        };
        sliderPanels[i].onmouseover = function() {
            if (timer) clearInterval(timer);
            sliderPage.style.display = "";

        };
        sliderPage.onmouseover = function() {
            sliderPage.style.display = "";
        };
        sliderPanels[i].onmouseout = function() {
            autoChange(currentPoint);
            sliderPage.style.display = "none";
        };
    })( i );
}
怪我咯

你出错的是 162 行,这一句

sliderNavs[id].style.backgroundColor = "red";
大家讲道理

@Erichain_Zain 解释到位了。就补充个关于let的链接好了

伊谢尔伦

这是一个典型的闭包问题.
先看下面这段程序,看看结果为什么是这样.

var l1 = []
for (let i = 0; i < 3; i++) {
  l1.push(function () {
    console.log(i)
  })
}
for (var foo of l1) foo()
// 输出 0 1 2

var l2 = []
for (var j = 0; j < 3; j++) {
  l2.push(function () {
    console.log(j)
  })
}
for (var bar of l2) bar()
// 输出 3 3 3

你用var的时候产生了闭包. 在你那个循环最后i变成了6, 把i=6的情况传给了changeImg, 导致了错误.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号