执行环节定义了函数或者变量能够访问的其它数据,决定了他们各自的行为。
每一个执行环境都有一个与之关联的变量对象,在环境中定义的全部变量和函数都保存在这个变量中,而且是咱们没法访问。
每一个函数都有本身的执行环境,当执行流进入一个函数的时候,就把函数的执行环境压入执行环境栈,执行完毕后,再将环境推出,把控制权交给以前的执行环境。javascript
当代码在一个环境中执行的时候,会建立变量对象的做用域链,做用域链的用途是保证对执行环境有权访问的全部变量和函数的有序访问。
做用域链的前端,始终都是当前执行代码所在环境的变量对象.若是这个环境是函数,则将其活动对象做为变量对象.做用域链中的下一个变量对象来自包含环境,最终到全局对象window.
延长做用域链 try catch 和 with语句.css
垃圾收集器在运行的时候会给存储在内存中的全部变量都加上标记,而后,他会去掉环境中的变量以及被环境中变量引用的变量的标记.
而在此以后有标记的变量将被视为准备删除的变量.html
跟踪记录每一个值被引用的次数 ,经过引用来适当增长他的引用次数,当引用计数为0时,代表该变量能够被清除.前端
undefiend/变量未定义 boolean/布尔值 string/字符串 number/数值 object对象或者null function/函数 symbol/Symboljava
[注意]:web
全等比较前不会转换操做数,其余状况同样.算法
能够分为 强缓存和协商缓存chrome
1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中能够看到该请求返回200的状态码,而且size显示from disk cache或from memory cache;数据库
2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,若是命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;json
3.二者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求
Expires:response header里的过时时间,浏览器再次加载资源时,若是在这个过时时间内,则命中强缓存。
Cache-Control:当值设为max-age=300时,则表明在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。
Expires和Cache-Control:max-age=* 的做用是差很少的,区别就在于 Expires 是http1.0的产物,Cache-Control是http1.1的产物,二者同时存在的话,Cache-Control优先级高于Expires;在某些不支持HTTP1.1的环境下,Expires就会发挥用处。因此Expires实际上是过期的产物,现阶段它的存在只是一种兼容性的写法
ETag和If-None-Match:这两个要一块儿说。Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种惟一标识,只要资源有变化,Etag就会从新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值作比较,若是相同,则表示资源文件没有发生改变,命中协商缓存。
Last-Modified和If-Modified-Since:这两个也要一块儿说。Last-Modified是该资源文件最后一次更改时间,服务器会在response header里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到request header里的If-Modified-Since里,服务器在接收到后也会作比对,若是相同则命中协商缓存。
首先在精确度上,Etag要优于Last-Modified。Last-Modified的时间单位是秒,若是某个文件在1秒内改变了屡次,那么他们的Last-Modified其实并无体现出来修改,可是Etag每次都会改变确保了精度;若是是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只须要记录时间,而Etag须要服务器经过算法来计算出一个hash值。
第三在优先级上,服务器校验优先考虑Etag。
浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间一并缓存;
下一次加载资源时,先比较当前时间和上一次返回200时的时间差,若是没有超过cache-control设置的max-age,则没有过时,命中强缓存,不发请求直接从本地缓存读取该文件(若是浏览器不支持HTTP1.1,则用expires判断是否过时);若是时间过时,则向服务器发送header带有If-None-Match和If-Modified-Since 的请求;
服务器收到请求后,优先根据Etag的值判断被请求的文件有没有作修改,Etag值一致则没有修改,命中协商缓存,返回304;若是不一致则有改动,直接返回新的资源文件带上新的Etag值并返回 200;
若是服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的最后修改时间作比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回 200;
地址栏访问,连接跳转是正经常使用户行为,将会触发浏览器缓存机制;
F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;
ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。
说到跨域,首先就要提到一个前端的安全概念,即浏览器的同源策略.
简单来讲,就是浏览器为了保证用户信息的安全,防止恶意的网站窃取数据,只容许同源的js脚本操做本页面。
那若是咱们须要在同一个页面中请求非同源的数据怎么办呢?这个就涉及到跨域问题了。
同源须要同时知足如下三个条件:
注意:父域名同样,子域名不同也是非同源的。
若是非同源,如下三种行为将受到限制:
(1) Cookie、LocalStorage 和 IndexDB 没法读取。
(2) DOM 没法得到。
(3) AJAX 请求不能发送。
这是一种最经常使用也是支持度比较高的跨域方式,其原理动态插入script
标签,经过script
标签引入一个js
文件,这个js文件载入成功后会执行咱们在url参数中指定的函数,而且会把咱们须要的json
数据做为参数传入。
优势是兼容性好,简单易用,支持浏览器与服务器双向通讯。缺点是只支持GET请求。
服务器端对于CORS
的支持,主要就是经过设置Access-Control-Allow-Origin
来进行的。若是浏览器检测到相应的设置,就能够容许Ajax
进行跨域的访问。
以上两种方式主要用来跟后台数据交互.
将子域和主域的document.domain
设为同一个主域.前提条件:这两个域名必须属于同一个基础域名!并且所用的协议,端口都要一致,不然没法利用document.domain
进行跨域
主域相同的使用document.domain
此方法能够用来解决跨域cookie本地存储的跨域访问,LocalStorage 和 IndexDB 没法经过这种方法,规避同源政策,而要使用下文介绍的PostMessage API。
window
对象有个name
属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的全部的页面都是共享一个window.name
的,每一个页面对window.name
都有读写的权限,window.name
是持久存在一个窗口载入过的全部页面中的
以上两种主要用在 使用`iframe来实现页面结构的页面.完成DOM之间的跨域交互.
window.postMessage
方法来跨域传送数据该方法容许跨窗口通讯,不论这两个窗口是否同源。
方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源(origin),即"协议 + 域名 + 端口"。也能够设为*,表示不限制域名,向全部窗口发送。
postMessage/addEventListener 基本相似于一个全局的事件管理器.能够经过这两个接口来发送/监听 事件,从而完成信息交互.
无论怎么触发,都是按照指定的间隔来执行,一样给个基本版。
请输入代码function throttle(func, wait) { var timer return function() { var context = this var args = arguments if (!timer) { timer = setTimeout(function () { timer = null func.apply(context, args) }, wait) } } }
无论你触发多少次,都等到你最后触发后过一段你指定的时间才触发。按照这个解释,写一个基本版的。
function debounce(func, wait) { var timer return function() { var context = this var args = arguments clearTimeout(timer) timer = setTimeout(function() { func.apply(context, args) }, wait) } }
text-align: center;
便可实现text-align: center;
,再给子元素恢复须要的值position: relative;
,3)浮动方向偏移量(left或者right)设置为50%,4)浮动方向上的margin设置为元素宽度一半乘以-1font-size
的line-height
:(block formatting context),
建立规则:
float
不是none
)position
取值为absolute
或fixed
)display
取值为inline-block
,table-cell
, table-caption
,flex
, inline-flex
之一的元素overflow
不是visible
的元素做用:
根据css rules 与dom tree 生成render tree。浏览器先产生一个元素集合,这个集合每每由最后一个部分的索引产生(若是没有索引就是全部元素的集合)。
而后向上匹配,若是不符合上一个部分,就把元素从集合中删除,直到真个选择器都匹配完,还在集合中的元素就匹配这个选择器了。
举个例子,有选择器:
body.ready #wrapper > .lol233
先把全部 class 中有 lol233 的元素拿出来组成一个集合,而后上一层,对每个集合中的元素,若是元素的 parent id 不为 #wrapper 则把元素从集合中删去。 再向上,从这个元素的父元素开始向上找,没有找到一个 tagName 为 body 且 class 中有 ready 的元素,就把原来的元素从集合中删去。至此这个选择器匹配结束,全部还在集合中的元素知足。
1)效率,找元素的父亲和以前的兄弟比遍历全部儿子快并且方便。
2)关于文档流的解析方向,是由于如今的 CSS,一个元素只要肯定了这个元素在文档流以前出现过的全部元素,就能肯定他的匹配状况。应用在即便 html 没有载入完成,浏览器也能根据已经载入的这一部分信息彻底肯定出现过的元素的属性。
主要也仍是效率。
基于 CSS Rule 数量远远小于元素数量的假设和索引的运用,遍历每一条 CSS Rule 经过集合筛选,比遍历每个元素再遍历每一条 Rule 匹配要快得多。
先看下各个属性值的定义:
一、static:默认值。没有定位,元素出如今正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。
二、relative:生成相对定位的元素,经过top,bottom,left,right的设置相对于其正常位置进行定位。可经过z-index进行层次分级。
三、absolute:生成绝对定位的元素,相对于 static 定位之外的第一个父元素进行定位。元素的位置经过 "left", "top", "right" 以及 "bottom" 属性进行规定。可经过z-index进行层次分级。
四、fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置经过 "left", "top", "right" 以及 "bottom" 属性进行规定。可经过z-index进行层次分级。
static与fixed的定位方式较好理解,在此不作分析。下面对应用的较多的relative和absolute进行分析:
一、relative。定位为relative的元素脱离正常的文本流中,但其在文本流中的位置依然存在,依然占有原来的位置,后面的元素没法向前补充。
二、absolute。定位为absolute的层脱离正常文本流,但与relative的区别是其在正常流中的位置不在存在,至关于被提高到另外一个层面去了,后面的元素会补占它的位置。
首先,是上面已经提到过的在正常流中的位置存在与否。
其次,relative定位的层老是相对于其最近的父元素,absolute定位的层老是相对于其最近的定义为absolute或 relative的父层,而这个父层并不必定是其直接父层。若是其父层中都未定义absolute或relative,则其将相对body进行定位。
fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。
自适应布局(Adaptive Layout)
自适应布局(Adaptive)的特色是分别为不一样的屏幕分辨率定义布局。布局切换时页面元素发生改变,但在每一个布局中,页面元素不随窗口大小的调整发生变化。
就是说你看到的页面,里面元素的位置会变化而大小不会变化;你能够把自适应布局看做是静态布局的一个系列。
流式布局(Liquid Layout)
流式布局(Liquid)的特色(也叫"Fluid") 是页面元素的宽度按照屏幕进行适配调整,主要的问题是若是屏幕尺度跨度太大,那么在相对其原始设计而言太小或过大的屏幕上不能正常显示。
响应式布局(Responsive Layout)
分别为不一样的屏幕分辨率定义布局,同时,在每一个布局中,应用流式布局的理念,即页面元素宽度随着窗口调整而自动适配。 能够把响应式布局看做是流式布局和自适应布局设计理念的融合。
1XX 提示信息 - 表示请求已被成功接收,继续处理
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其他部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
2XX 成功 - 表示请求已被成功接收,理解,接受
200 (成功) 服务器已成功处理了请求。 一般,这表示服务器提供了请求的网页。
201 (已建立) 请求成功而且服务器建立了新的资源。
3XX 重定向 - 要完成请求必须进行更进一步的处理
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
4XX 客户端错误 - 请求有语法错误或请求没法实现
400 (错误请求) 服务器不理解请求的语法。
401 (未受权) 请求要求身份验证。 对于须要登陆的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
5XX 服务器端错误 - 服务器未能实现合法的请求
500 (服务器内部错误) 服务器遇到错误,没法完成请求。
501 (还没有实施) 服务器不具有完成请求的功能。 例如,服务器没法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器做为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前没法使用(因为超载或停机维护)。 一般,这只是暂时状态。
504 (网关超时) 服务器做为网关或代理,可是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
content方面
Server方面
Cookie方面
css方面
Javascript方面
图片方面
移动方面
即将须要传输的内容压缩后传输到客户端再解压,这样在网络上传输的 数据量就会大幅减少。一般在服务器上的Apache、Nginx能够直接开启这个设置,也能够从代码角度直接设置传输文件头,增长gzip的设置,也能够 从 负载均衡设备直接设置。不过须要留意的是,这个设置会略微增长服务器的负担。建议服务器性能不是很好的网站,要慎重考虑。
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽量避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的情况,提升用户访问网站的响应速度。
Ajax调用都采用缓存调用方式,通常采用附加特征参数方式实现,注意其中的<script src=”xxx.js?{VERHASH}”,{VERHASH}就是特征参数,这个参数不变化就使用缓存文件,若是发生变化则从新下载新文件或更新信息。
浏览器查看缓存,若是请求资源在缓存中而且新鲜,跳转到转码步骤
检验新鲜一般有两个HTTP头进行控制Expires
和Cache-Control
:
浏览器获取主机ip地址,过程以下:
打开一个socket与目标IP地址,端口创建TCP连接,三次握手以下:
浏览器接收HTTP响应,而后根据状况选择关闭TCP链接或者保留重用,关闭TCP链接的四次握手以下:
构建DOM树:
构建CSSOM树:
script
,meta
这样自己不可见的标签。2)被css隐藏的节点,如display: none
js解析以下:
web语义化是指经过HTML标记表示页面包含的信息,包含了HTML标签的语义化和css命名的语义化。
HTML标签的语义化是指:经过使用包含语义的标签(如h1-h6)恰当地表示文档结构
css命名的语义化是指:为html标签添加有意义的class,id补充未表达的语义,如Microformat经过添加符合规则的class描述信息
为何须要语义化:
模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块。
那么在理想状态下咱们只须要完成本身部分的核心业务逻辑代码,其余方面的依赖能够经过直接加载被人已经写好模块进行使用便可。
首先,既然是模块化设计,那么做为一个模块化系统所必须的能力:
1. 定义封装的模块。 2. 定义新模块对其余模块的依赖。 3. 可对其余模块的引入支持。
不一样之处
二者的主要区别以下:
RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。
Sea.js 则专一于 Web 浏览器端,同时经过 Node 扩展的方式能够很方便跑在 Node 环境中。