老师,为什么调用函数写在上面会出BUG,写在下面却没有问题
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="css/轮播图.css"> <script src="js/轮播图.js"></script> </head> <body> <div class="main" id="main"> <!-- 图片轮播 --> <div class="banner" id="banner"> <a href="" class="banner-slide slide1 slide-active"></a> <a href="" class="banner-slide slide2"></a> <a href="" class="banner-slide slide3"></a> </div> <!-- 上一张、下一张按钮 --> <a href="javascript:;" class="button prev"></a> <a href="javascript:;" class="button next"></a> <!-- 圆点导航 --> <div class="dots" id="dots"> <span class="active"></span> <span></span> <span></span> </div> </div> </body> </html>
* { margin: 0; padding: 0; } ul { list-style: none; } body { font-family: '微软雅黑'; color: #14191e; } .main { position: relative; margin: 30px auto; width: 1200px; height: 460px; overflow: hidden; } /* 图片轮播 */ .banner { position: relative; width: 1200px; height: 460px; overflow: hidden; } .banner-slide { position:absolute; display: none; width: 1200px; height: 460px; background-repeat: no-repeat; } .slide1 { background-image: url(../img/bg1.jpg); } .slide2 { background-image: url(../img/bg2.jpg); } .slide3 { background-image: url(../img/bg3.jpg); } /* 当前图片显示 */ .slide-active { display: block; } /* 上一张、下一张按钮 */ .button { position: absolute; top: 50%; right: 0; background: url(../img/arrow.png) no-repeat center; margin-top: -40px; width: 40px; height: 80px; } .button:hover { background-color: #333; opacity: .3; filter: alpha(opacity=30); /*兼容IE浏览器*/ } .prev { left: 244px; transform: rotate(180deg); } /* 圆点导航 */ .dots { position: absolute; bottom: 12px; right: 8px; text-align: right; } .dots span { display: inline-block; width: 12px; height: 12px; line-height: 12px; border-radius: 50%; background: rgba(7,17,17,.4); margin-right: 4px; box-shadow: 0 0 0 2px rgba(255,255,255,.8) inset; cursor: pointer; } .dots span.active { background: #fff; box-shadow: 0 0 0 2px rgba(7,17,17,.4) inset; }
window.onload = function () { // 封装一个代替ElementById()的方法 function byId(id) { return typeof(id) === 'string' ? document.getElementById(id) : id; } // 调用函数写在这里,鼠标移入图片,定时器不会停止 // slideImg(); var index = 0; var timer = null; var pics = byId('banner').getElementsByTagName('a'); var len = pics.length; var dots = byId('dots').getElementsByTagName('span'); function slideImg() { var main = byId('main'); // 当鼠标移动到main上,轮播图停止 main.onmouseover = function () { // 清除定时器 if(timer) { clearInterval(timer); console.log(timer); } } // 当鼠标移出main,轮播图继续 main.onmouseout = function () { // 调用onmouseout事件 timer = setInterval(function () { index++; if(index >= len) { index = 0; } // 切换图片 changeImg(); },2000); } // 调用onmouseout方法 main.onmouseout(); // 绑定点击事件,点击圆点切换图片 for(var j = 0; j < len; j++) { dots[j].onclick = function () { } } } // 切换图片 function changeImg() { // 隐藏所有的图片 for(var i = 0; i < len; i++) { pics[i].style.display = 'none'; dots[i].className = ''; } // 根据index索引显示当前图片 pics[index].style.display = 'block'; dots[index].className = 'active'; } // 调用函数写在最后,鼠标移入图片,定时器会关闭 slideImg(); }
还有当浏览器遇到一个定义好的函数,但是还没有遇到调用这个函数的代码,那么浏览器是直接跳过这个函数继续读取下面的代码,还是先读取一次这个函数,等到遇到调用这个函数的代码,再回头调用它?
0
收起
正在回答
2回答
你好 ,老师上个回复中说过 , 因为变量存在预解析的 , 所以变量的定义在函数执行的时候就已经定义好了 , 但是赋值会在原来的位置上赋值 , 所以赋值为null ,和什么都不赋值相当于如下:
预解析的过程 :
所以什么都不赋值的情况下 ,是直接把变量定义给提升到最上面 , timer被赋值为定时器不会被覆盖
以上都属于高级课程中的知识了, 目前先了解一下即可 . 还是建议同学以后学习了高级阶段 , 有了基础才能更好的去理解 .目前阶段练习 , 建议同学按照代码顺序去写代码 , 把函数调用写在后面 , 以避免不必要的错误 .
祝学习愉快 ,望采纳 .
前端小白入门系列课程
- 参与学习 人
- 提交作业 11218 份
- 解答问题 36713 个
从一个不会编程的小白到一个老司机是需要过程的,首先得入门,学习基础知识,然后才能进阶,最后再到精通,本专题是你走进前端世界的不二选择!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星