上回书说到
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var btns = document.getElementsByTagName( "button")//遍历加监听
for(var i = 0,length=btns.length; i < length; i++) {
var btn = btns[i]
btn.onclick = function (){
alert("第"+(i+1)+"个")
}
}
</script>
</head>
<body>
<button>测试1</button>
<button>测试2</button>
<button>测试3</button>
</body>
</html>
这个for循环并没有正确alert而是都输出了四,为啥呢,今天说一下自己发现的一些原因可谓是茅塞顿开啊
事件循环模型
js并不像java一样从上到下运行,所以说JavaScript跟java完全不同,那js咋运行的?
首先将所有代码分类,这次分类后除了正常的代码还有两类特别的
模型的2个重要组成部分:
* 事件管理模块(定时器/DOM事件/Ajax)管理模块(如上面的给按钮加个事件之类的,以及Ajax接口)
* 回调队列callbackqueue(就是回调函数,这个函数是能在函数中返回东西的函数)
模型的运转流程
* 执行初始化代码, 将事件回调函数交给对应模块管理
* 当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中
* 只有当初始化代码执行完后(可能要一定时间), 才会遍历读取回调队列中的回调函数执行
什么意思呢?
就是说,在执行完初始化代码后,再执行那几个特殊的代码时,它们实际上是在分线程中执行的,而不是主线程中;
以上面例子为例,js是先执行的for循环,for循环执行完后,当我们点击时,他才把这个dom事件赋值给了这个按钮,所以才会出现这个情况。