http response header key
Cache-Control http1.1最主要的key,指定缓存机制
Pragma http1.0指定缓存机制 当Pragma:no-cache时等同于Cache-Control:no-cache(在浏览器中disable cache就是在所有请求的请求头上加上Pragma:no-cache)
Expires http1.0指定缓存的过期时间,当和Cache-Control同时存在时优先取Cache-Control的值
Cache-Control内又有多个属性值,常见的是max-age,指定资源缓存的过期时间(s)
Pragma一般用于调试,现在在response头上手动处理Pragma的很少很少。
Expires和max-age类似,差别在于expires是一个固定的服务器时间点
http response header key
ETag(服务端返回的当前资源的etag值)Last-Modified(服务端返回的当前资源的最后修改时间)
http request headerkey
If-None-Match (上一次服务器对于当前资源返回的etag值)与服务器中资源的etag比较,如果相同,服务器会返回304,浏览器会重定向进缓存找资源
If-Modified-Since (上一次服务器对于当前资源返回的最后修改时间)与服务器中资源的最后修改时间比较,如果相同,服务器会返回304,浏览器会重定向进缓存找资源
会先进memory cache查找资源,如果找不到则去disk cache中查找
1、CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用
CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。
ES6 Modules 的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。换句话说,ES6的import 有点像 Unix 系统的“符号连接”,原始值变了,import加载的值也会跟着变。因此,ES6模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
2、CommonJS 模块是运行时加载,ES6 模块是编译时输出接口
运行时加载: CommonJS 模块就是对象;即在输入时是先加载整个模块,生成一个对象,然后再从这个对象上面读取方法,这种加载称为“运行时加载”。
编译时加载: ES6 模块不是对象,而是通过 export 命令显式指定输出的代码,import时采用静态命令的形式。即在import时可以指定加载某个输出值,而不是加载整个模块,这种加载称为“编译时加载”
使用 setInterval() 创建的定时器确保了定时器代码规则地插入队列中。这个方式的问题在于,定时器代码可能在代码再次被添加到队列之前还没有完成执行,结果导致定时器代码连续运行好几次,而之间没有任何停顿。幸好,JavaScript 引擎够聪明,能避免这个问题。当使用 setInterval() 时,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔。
这种重复定时器的规则有两个问题:
(1) 某些间隔会被跳过;
(2) 多个定时器的代码执行之间的间隔可能会比预期的小。假设,某个 onclick 事件处理程序使用setInterval() 设置了一个 200ms 间隔的重复定时器。如果事件处理程序花了 300ms多一点的时间完成,同时定时器代码也花了差不多的时间,就会同时出现跳过间隔且连续运行定时器代码的情况
为了避免 setInterval() 的重复定时器的这2个缺点,你可以用如下模式使用链式 setTimeout()
调用。
setTimeout(function(){
//处理中
setTimeout(arguments.callee, interval);
}, interval);
这个模式链式调用了 setTimeout() ,每次函数执行的时候都会创建一个新的定时器。第二个
setTimeout() 调用使用了 arguments.callee 来获取对当前执行的函数的引用,并为其设置另外一个定时器。这样做的好处是,在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔。而且,它可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。这个模式主要用于重复定时器
原文:https://www.cnblogs.com/chujunqiao/p/12452374.html