js学习笔记1

会有一股神秘感。 提交于 2020-01-21 07:30:38

html css javascript简介:

html 定义了网页的内容

css 描述了网页的布局

javascript 定义了网页了行为

 

编译器和解释器:

解释器和编译器的工作是解析代码并执行,区别在于,对于静态语言(java,C++,C等)而言,这部分工作由编译器执行,编译器会先将源代码编译为另一种代码(机器码或字节码等)再执行;

而对于javascript这种动态语言,解释器会直接解析源代码并执行

 

javascript简介:

javascript是一种轻量级的编程语言

1.语法简单

2.不用编译:可以由javascript引擎解释执行(但是目前还很难说javascript引擎是解释器还是编译器,因为Chrome的JS引擎V8,为了提高JS的运行性能,在运行之前会先将JS编译为本地的

机器码,然后再去执行机器码,这样效率就会提示很多)

3.不依赖于ide,调试方便(Javascript引擎是浏览器的组成部分之一,一般情况下都是由浏览器开发商自行开发的,如IE9的Chakra、Firefox的TraceMonkey、Chrome的V8,除了Javascript引擎外,浏览器还要做很多其他的事情,例如页面解析、页面渲染、Cookie管理、历史记录等等)

 

Javascript语言特性:

1.单线程:由于Javascript作为浏览器脚本语言,主要的用途是和用户互动,以及操作DOM节点,这决定了它只能是单线程,否则会带来很复杂的同步问题。所以,为了避免复杂性,从诞生起,Javascript就是单线程的,

这已经成为这门语言的核心特征,将来也不会改变

2.任务队列:由于Javascript是单线程的,所以所有的任务需要排队执行,但是如果前一个任务耗时很长(例如一些从网络读取数据的操作)的话,后一个任务就不得不等待执行,

JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

同步执行和异步执行的运行机制如下:

1:所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)

2:主线程之外,还存在一个任务队列(task queue),只要异步任务有了执行结果,就会在任务队列中放置一个事件

3:一旦执行栈中的同步任务执行完毕,系统就会读取任务队列,看看里面有哪些事件,那些对应的异步任务就结束等待状态,进入执行栈开始执行

4:主线程不断重复上面的步骤

3.事件和回调函数:任务队列是一个事件的队列,IO设备完成一项任务,就在任务队列中添加一个事件,表示相关的异步任务可以进入执行栈了,主线程读取任务队列,就会读取里面有哪些事件。

任务队列中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击,页面滚动等),只要指定过回调函数,这些事件发生时就会进入任务队列,等待主线程读取

所谓"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。

"任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动进入主线程。但是,由于存在后文提到的"定时器"功能,主线程首先要检查一下执行时间,某些事件只有到了规定的时间,才能返回主线程。

4.Event Loop:主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)

5.定时器:

除了放置异步任务的事件,"任务队列"还可以放置定时事件,即指定某些代码在多少时间之后执行。这叫做"定时器"(timer)功能,也就是定时执行的代码。

定时器功能主要由setTimeout()和setInterval()这两个函数来完成,它们的内部运行机制完全一样,区别在于前者指定的代码是一次性执行,后者则为反复执行

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!