for循环引发的一些问题,事件循环模型

上回书说到

<!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事件赋值给了这个按钮,所以才会出现这个情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值