JavaScript编程知识总结

JavaScript编程知识总结:

解释型语言和编译型语言

计算机语言概念

计算机只能识别机器语言,而我们平常遇到的编程语言一般都是高级语言;计算机是不能直接识别的,所以需要编译器对高级语言进行解释成机器语言。这样计算机才能执行高级语言的指令;

  1. 解释型语言:在程序运行时进行代码解释,它不需要编译。有专门的解释器,所以只要有相应的解释器可以在任何系统上运行,也就是跨平台性;例如解释型Java,我们每一次保存代码,都要翻译一次,所以效率比较低;
  2. 编译型语言:直接将目标源代码一次性编译成机器可以执行的(.exe .dll .ocx),也就是以后要运行就不需要重新编译了,直接执行就OK;不像解释型语言,一条条解释执行源代码。所以编译型语言执行效率高,同时编译型语言但是不能跨平台。例如Delphi,C++,ASM,C是直接编译成exe文件并且自带条件编译功能。

堆栈基本了解:

“堆栈”:堆(stack)栈(heap)是一种数据结构;它们是两个不同的概念;堆(heap)是没有具体结构,数据随意存放(也就是无序的);栈(stack)有具体结构的,数据是按照相应的顺序存放,而且数据大小确定的;栈的执行方式是先进后出,后进先出;类似于叠积木,从上面叠加积木,也只能从上面拿走积木;
在内存中一般会分配堆(heap)和栈(stack)两种存储空间,用来存储相应的数据;根据“栈具有结构性,数据大小确定性,数据排序有序性;堆没有结构,数据大小不确定,数据顺序随意”可知存储数据的规则;基本类型的数据局部变量一般存放在栈中;对于对象,数组之类的数据内容存放在堆中,数据地址存放在栈中,栈具有结构性,所以寻址效率快;
在JavaScript中,基本类型的变量直接存储在栈(stack)中;(说明:JavaScript中的全局变量其实也是数据window对象的局部变量);Array,Object类型数据存储在堆中,数据地址存放在栈中;

JavaScript垃圾回收机制:

在JavaScript中有自动回收机制,对于函数内的局部变量,如果函数执行完毕(脱离了该函数内的执行环境),就会回收内存;对于全局变量,主要观察是否有其他程序对全局变量的引用,如果没有引用,就会回收内容;也可以通过初始化null来进行回收内容;设置null是为了解除引用不是自动回收该值所占用的内存,而是让值脱离执行环境,以便GC(Garbage Collection)垃圾回收机制下次运行时将其回收;

JavaScript单线程机制:

单线程特点就决定了JavaScript对主线程上(严格来说就是一个线程,没有主次之分)的任务的操作模式是一对一的形式,也就是一次只能执行一个任务;该特点的优点就是执行环境简单,容易实现,对于DOM对象操作简单性,一致性(例如有两个线程同时操作同一个DOM对象,那么以哪个线程里的操作为准呢?);缺点就是如果在主线程遇到耗时任务会导致堵塞后续需要等待执行的程序,也就会造成浏览器假死和崩溃的问题;对于耗时操作怎么办?异步操作和HTML5的worker特性;

JavaScript异步任务执行机制:

在JavaScript中,遇到需要执行的异步任务,先将该异步任务挂起,放到任务队列(队列的特性:有序的,先进先出)里面,然后执行完行主线程内的任务;执行完主线程的任务后,系统才会去读取任务队列面的异步任务;任务队列里面的异步任务执行顺序,再不考虑时间的情况下(setTimeout()和setInterval()定时初始值为0),执行顺序是先进先出;代码如下:

以上代码可知:Promise异步对象先执行,然后再执行setTimeout()定时任务里面的回调函数;注意并不是代码在上面的先执行顺序来定的,根据程序所在的执行环境有关;在任务队列中是先进先出,程序自上而下执行,所以Promise对象属于后
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

猜你喜欢

转载自blog.csdn.net/u012475786/article/details/87912104
今日推荐