javascript - js中函数和变量的访问顺序?
怪我咯
怪我咯 2017-04-11 12:03:51
[JavaScript讨论组]

新学HTML5,遇到个问题,我在利用input type="file"控件读取本地的JSON文件里的JSON数据并插入到body中去,代码如下:




我发现两次console.log打印的结果,反而是先aa=1被打印出来,其次onload函数里面的aa=2才被打印出来,我查资料得知reader的onload方法是在它调用readAsText方法后立即调用的,为什么会先打印后面的console(也就是说我在onload方法外面调用的全是aa=1),这个onload函数和后面的console调用顺序究竟是怎样?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
PHP中文网

readAsText 再快也是有时滞的,有相当大的几率会落在顺序执行的 console.log(1) 之后执行

天蓬老师

因为js是单线程执行的,会把当前代码流先执行完。就算onload事件触发了,响应事件也只是会放入到队列中,等待当前代码先执行完再执行。

伊谢尔伦

跟文件大小、读取时间耗时长短无关。
先输出1后输出2是必然的!

证明如下:

首先写一个阻塞函数,用于阻塞JS执行线程一段时间:

function block(delay) {
    var end = +new Date() + delay;
    while(+new Date() <= end){}
}

然后,把它加到你的代码中:

reader.readAsText();
block(5000);
reader.onload = function() {
    console.log(2);
};
block(5000);
console.log(1);

结果是什么?是不论你阻塞多长时间,结果都是先输出1,后输出2。

结论就是:

onload回调函数被设计成了不在当前这一轮事件循环调用

所以,哪怕文件内容瞬间就被读完了,结果也是先输出1。
这不是一个概率性的结论,而是一个确定的结论。

参考:彻底理解同步、异步和事件循环

天蓬老师

onload是一个事件,当读取操作完成时触发并调用,这相当于一个异步回调,而读取文件消耗的时间绝大多数情况下都要慢于程序的执行,所以自然是先执行log a=1的情况。

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

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