为什么script标签中的setInterval方法无需设置onload事件即可运行?
未绑定onload也触发setInterval的原因
浏览器解析HTML页面遵循从上到下的顺序,遇到<script>标签时会立即执行标签内的同步代码,和是否绑定onload事件没有强制关联:
- onload事件的触发时机是页面所有资源(图片、样式表、音频等)全部加载完成,属于延迟触发的事件,而你写的
window.setInterval(image,4000)是同步执行的代码,只要浏览器解析到这一行就会直接运行。 - 你的script标签放在img标签的下方,执行image函数时,id为
img1的DOM节点已经完成解析,所以document.getElementById("img1")可以正常获取到元素,不会报错,整个功能自然可以正常运行。
setInterval的调用对象
调用setInterval的是浏览器的window全局对象:
- 你代码中已经显式写了
window.setInterval,明确是调用window对象下的方法。 - 就算你省略window前缀,直接写
setInterval(xxx)也能正常执行,因为setInterval是浏览器暴露在全局作用域的原生API,默认挂载在window对象下,全局作用域下调用时默认绑定到window对象。
补充说明
如果你把这段script标签挪到head标签内,又没有绑定DOMContentLoaded或者onload事件的话,执行image函数时img节点还没被解析,document.getElementById("img1")会返回null,给null赋值src就会抛出报错,这种场景下才需要手动把setInterval的触发逻辑绑定到DOM加载完成的事件上。
内容的提问来源于stack exchange,提问作者Sudarshan Patil
相关产品推荐
相关产品推荐

