仅仅是笔记,不是原创不是原创不是原创
javascript是一门单线程语言,所以js是按照语句出现的顺序执行的。h5提出web-worker,但是js的多线程都是由单线程模拟出来的。为解决单线程时间等待的问题,将任务分为同步任务/异步任务。
同步任务:在主线程上排队执行的任务,前一个任务执行完毕,才能执行下一个任务
异步任务:不进入主线程,进入任务队列。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。
任务队列:是先进先出的数据结构
- 所有同步任务都在主线程上执行,形成一个执行栈
- 主线程之外还存在一个任务队列,只要异步任务有了结果,就在任务队列之中放置一个事件
- 一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列中的异步任务,对应的异步任务结束等待状态,进入执行栈开始执行.
- 主线程不断重复上面的第三步
总结:只要主线程空了,就会去读取任务队列
event loop
js执行机制:首先判断js是同步还是异步,同步进入主进程,异步进入event table,异步任务在event table中注册函数,当满足触发条件后,被推入event queue。同步任务进入主线程后一直执行,直到主线程空闲时,才会去event table中查看是否有可执行的异步任务,如果有就推入主进程中。
定时器:setTimeout
当设置的时间计时完毕,setTimeout里面的函数会被推入event queue,当主线程空闲后才会执行
全局变量:在函数外定义的变量&在函数内没有声明(没有使用var关键字),页面关闭后即消失。
局部变量:只能在函数内部访问,在函数开始执行时创建,函数执行完后局部变量自动销毁
未使用值声明的变量,其值是undefind
函数
广义式函数定义:
function fun(){
var a = 0;
}
赋值式函数定义:
var fun = function(){
var a = 0;
}
页面加载过程中,浏览器对页面上或载入的每个js代码块(或文件)进行扫描,遇到定义式函数,则进行预处理,处理完成后再开始由上至下执行,也就是说,可以在函数定义之前调用,程序依旧能解析;遇到赋值式函数,则只是将函数赋给一个变量,不进行预处理,待调用时才进行处理,也就是说,必须在函数定义之后使用,否则会发生 **is not a function的错误。且会将所有变量声明”提升“到函数顶部。
js函数是靠类似于数组的arguments对象获取参数的。arguments能在函数内部被赋值。
js对每个块(一对包裹的js代码)或文件进行独立的扫描,再对全局的代码进行顺序执行。在一个块中,函数可以在调用之后进行定义式函数定义,但在两个块中,定义函数所在的块必须在函数被调用的块之前。
body的onload函数与body内部函数的执行:
body的onload事件触发条件是body内容加载完成,body中的js代码会在这一事件触发之前运行