js执行顺序和js异步

感谢:http://www.cnblogs.com/zhaodongyu/p/3922961.html
感谢:http://www.2cto.com/kf/201401/273825.html


单线程异步执行的JavaScript

JavaScript是单线程异步执行的。
单线程意味着代码在任务队列中会按照顺序一个接一个执行。
异步代表JavaScript代码在任务队列中的顺序并不会等同于代码的书写顺序。比如事件绑定,ajax,setTimeout等任务的发生时期是不可预期的。

js的执行顺序

JavaScript程序的执行顺序有两个阶段。
第一阶段,载入文档,(预编译会对本代码块中的所有声明的变量和函数进行处理,此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值),执行代码块。
第二阶段,执行事件驱动程序(此时是异步的,由事件驱动的)。

遇到的问题

function A(){
        var that=this;
        this.img={};
        this.img.self=new Image();
        this.imgInit=(function(){
            that.img.self.onload=function(){
                that.img.x=300;
                that.img.y=400;
            }
            that.img.self.src="img/1.png";
        })();
    }
    var a=new A();
    console.log(a.img);
    console.log(a.img.y);
运行结果

运行结果
为什么img的所有属性y有值,而单独打印时是undefined?

解决

就是开始所说的js执行顺序,异步,预编译原理

function A(){
        console.log(2);//第二步
        var that=this;
        this.img={};
        this.img.self=new Image();
        this.imgInit=(function(){
            that.img.self.onload=function(){//img的onload事件,需要在文档加载之后执行
                that.img.x=300;
                that.img.y=400;
                console.log(4);//第四步
            }
            that.img.self.src="img/1.png";
        })();
        this.init=function(){
            that.img.h=600;
        }
    }
    console.log(1);//第一步
    var a=new A();//执行构造函数
    console.log(a.img);//打印对象a的img,有x,y,但是没有h
    console.log(a.img.y);//undefined
    console.log(a.img.h);//undefined
    window.onload=function(){//window的onload事件
        console.log(5);//第五步
        console.log(a.img.y);//400
        console.log(a.img.h);//undefined
    }
    console.log(3);//第三步
运行结果

运行结果
[TOC]

相对于主线程,JavaScript中的异步执行和同步执行顺序有所不同。在同步执行中,代码会按照顺序依次执行,每个操作都会等待前一个操作完成后再执行下一个操作。这意味着在同步执行中,主线程必须等待每个操作完成后才能继续执行下一个操作。这可能导致程序的执行效率较低。 而在异步执行中,当遇到耗时的操作时,主线程不会等待操作完成,而是会继续执行后续的操作。耗时的操作会被移交给其他线程或者Web APIs来处理,当操作完成后,会通过事件队列将结果返回给主线程继续处理。因此,在异步执行中,主线程可以并行执行其他任务,不需要等待耗时操作的完成。 总结来说,相对于主线程,异步执行的顺序是不需要等待耗时操作的完成,可以继续执行后续的操作;而同步执行的顺序是需要等待每个操作的完成才能继续执行下一个操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JS异步同步和EvenLoop单线程机制(一文读懂)](https://blog.csdn.net/qq_30386941/article/details/127550267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值