十五的学习日记20160930-jquery/ajax/JS引擎/job queue

十五的学习日记20160930

JavaScript

  1. jquery源代码分析
  2. 发起ajax请求的几个要点
    • 基础:
      • 前端: 构造头,构造体,发送包
      • 后端: 判断来源请求,构造头,构造体,返回包
    • 同源:
    • 跨域:
      • 1jquery自带方法
      • 2服务端允许接受跨域设置
      • 3服务器代理
    • 操作:
      • 状态改变事件监听.
  3. JS引擎不会单独运行,他会在一个宿主环境中运行,这个环境对大多数开发者来说就是web浏览器.而且在过去的几年(也不仅仅是过去几年),JS超出了浏览器到了其他领域.比如服务器,通过nodejs,实际上近年来JavaScript已经嵌入到了各种设备,从机器人到智能灯泡都有.
  4. 在这所有的环境中,都有一个普遍的"线程"(这是一个对异步的微妙称呼),这类"线程"都有一个机制,能在每次调用JS引擎的时候,随时间执行你的多个语句块,这个机制就叫做"事件循环".
  5. 换句话说,JS引擎内部没有感知时间先后的能力,而是一个按需执行任意JS片段的环境.而安排"事件"(js执行代码)则总是由JS外部环境来完成.
  6. 举个例子,当你的JS程序创建了一个Ajax请求,以从服务器获取一些数据,你设置了"响应"代码于一个函数中(通常称为回调函数),然后JS引擎告诉宿主环境:"嘿哥们儿, 我要暂停一下执行跟你说件事儿,当你无论何时完成了网络请求,并且获得了一些数据,请务必以调用这个函数返回给我."
  7. 然后浏览器就开始监听网络响应,当确实获得了一些数据时, 它就会安排一个回调函数放入事件循环中等待调用.
  8. 所以事件循环到底是什么?用一段伪代码来告诉你吧.
// eventloop 是一个扮演栈的数组(先进先出);
var eventloop=[];
var event;
//死循环
while(true){
    //提供一个时刻
    if(eventloop.length>0){
	    //获取下一个栈中的事件
	    event=eventloop.shift();
	    //执行该事件
	    try{
			event();
		}
		catch(err){
			reportError(err);
		}    
    }
    
}
  1. 有一点很重要,就是setTimeout函数不会把你的回调函数放入事件循环, 他会做的是设置一个计时器, 当到达指定时间, 宿主环境就会把你的回调函数放入到事件循环中, 如此一来, 将来的tick才会把他取出并执行.
  2. ES6的job queue.定义了一种异步的情况,他总是在当前tick的最后插入语句.
原文地址:https://www.cnblogs.com/always-naive/p/5933811.html