Fork me on GitHub

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少,买房就差你们打赏之外那部分钱

打开支付宝扫一扫,即可进行扫码打赏哦

奇文共欣赏,疑义相与析

全文总共6,515字,阅读时长预计需要24分钟,感谢您的阅读,有错误还望留言批评指正,一起交流学习。

April 28, 2017 » 12、老生常谈-从输入url到页面展示到底发生了什么

这个问题应该是前端面试中被问概率较大的知识点,综合考察了面试者对于操作系统,浏览器,计算机网络,HTTP协议,服务器等的基础。这道题可以考察面试者的计算机CS基本功,以及对每一块的掌握程度。
以下是几个主要的大步骤:

  1. 接收 URL,并拆分成协议,网络地址,资源路径
  2. 与缓存进行比对,如果请求的对象在缓存中,则直接进行第九步
  3. 如果网络地址不是一个 IP 地址,向操作系统询问,操作系统返回一个IP地址
  4. 浏览器向服务器发起一个 TCP 连接
  5. 浏览器通过 TCP 连接向服务器发起 HTTP 请求,HTTP 三次握手,HTTPS 握手过程则复杂得多
  6. 浏览器接受 HTTP 响应,这时候它能关闭 TCP 连接也能为另一个连接保留。
  7. 检查 HTTP header 里的状态码,并做出不同的处理方式。比如:错误(4XX、5XX),重定向(3XX),授权请求(2XX)
  8. 如果是可以缓存的,这个响应则会被存储起来
  9. 浏览器进行解码响应,并决定如何处理该响应(比如HTML页面,图像,声音等等)
  10. 浏览器渲染响应,或者为不能识别的类型提供下载的提示框
    实际情况远比这复杂的多。

下面这篇文章基本和前端知识没多大关系,不过了解下没有坏处
从输入 URL 到页面加载完成的过程中都发生了什么事情?

下面这篇文章结合一个实例来分析地址栏输入URL之后到底发生了哪些事情
地址栏输入URL之后到底发生了哪些事情?

这个从面试的角度分析就蛮好,太底层了毕竟太晦涩,这个就刚刚好
前端经典面试题: 从输入URL到页面加载发生了什么?

发现每一篇的侧重点都不同,这个也记录一下吧,学习之路,任重而道远
从一道百度面试题到分析输入url到页面返回的过程(或者查询返回过程)

April 26, 2017 » 11、深入浅出Javascript事件循环机制(上)

最近琢磨了好久的Javascript的事件循环机制,看了很多国内的博客总觉得写的还是不够深,很多都只说了Javascript的事件分为同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件。自己对大概的基础有所了解之后也没接着深入去查资料,这就导致我在面试的时候被面试官一点一点深挖的时候就懵了(囧)。

作者这段话说出了最近我的心声…之前一直也就是宽泛的了解有这么个东西,但是没有深入细致的了解,今天跟随作者脚步学习学习,日后再来温习,先记录一下。


下篇地址:深入浅出JavaScript事件循环机制(下)
然后再来理解这篇就好多了:从Promise来看JavaScript中的Event Loop、Tasks和Microtasks

April 22, 2017 » 10、CSRF 攻击的应对之道

虽然本人是网络工程专业的本科生,但是说起来羞愧啊,对于网络安全屁也不懂,大学四年过家家去了,屁也没学到,之前开发也接触到CSRF的防范,但是只是后端叫我怎么做就配合一下,但是其中的原理,甚至什么是CSRF都不知道,最近无意中看到几篇关于CSRF的文章,才算把这个东西摸清,直到看完这篇文章,才有种恍然大悟的感觉,原来这就是CSRF攻击,怪不得之前后端要我那么配合,加什么token验证,当初觉得他这么二笔,非要在请求头加个自定义的token,多发一次option请求,现在看起来还是Too young,too Simple啊。

为了惩罚自己,自己默写一下CSRF的定义:

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性。
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。

有哪些防御方案?

  1. 用户操作限制,比如验证码;
  2. 请求来源限制,比如限制HTTP Referer才能完成操作;
  3. token验证机制,比如请求数据字段中添加一个token,响应请求时校验其有效性;

第一种方案明显严重影响了用户体验,而且还有额外的开发成本;第二种方案成本最低,但是并不能保证100%安全,而且很有可能会埋坑;第三种方案,可取!

token验证的CSRF防御机制是公认最合适的方案。

还有一篇文章其实也不错,从前后端分离的切入点分析CSRF的防范之道。前后端分离架构下CSRF防御机制

这篇也不错:浅谈CSRF攻击方式
盗一张图,便于直观的理解:

April 22, 2017 » 9、每日一题系列

很好的一个系列,带你扫描之前的一些盲点,就是你知道有这个东西但具体是怎么样的你却不清楚,因为平时也没这些实践经验,对于这些概念和思想也是有所耳闻,看了这些系列,让我在脑海中对于一些概念和模型有一个更确切的认知,对于后端MVC,前后端分离出现的MVC,再到MVP,MVVM有了一个更清晰的认识,还有对于什么API( Application Programming Interface),终于知道了是三个单词的缩写了,哈哈,等等吧,反正从概念出发,又高于概念,不仅仅是概念,受益匪浅。

「每日一题」MVC 是什么?
「每日一题」MVC 是什么?(续1)
「每日一题」什么是 API?
「每日一题」什么是异步?
「每日一题」Callback(回调)是什么?
「每日一题」CSRF 是什么?
「每日一题」XSS 是什么?
「每日一题」什么是响应式页面?

还有更多,就不一一贴下来了,看完之后对这些知识有一个更明朗的认知就够了,以后开发体验估计就会感同身受了。

April 18, 2017 » 8、从proto和prototype来深入理解JS对象和原型链

看过很多篇关于proto和prototype的文章,很多都杂乱无章,感觉就是七拼八凑,唯有最近看到这篇文章才豁然开朗,作者先解释最容易理解的一些概念,然后进一步探讨引出鸡和蛋的问题,最后作者刨根问底,从ECMAScript解读,一层一层剥,慢慢拨云见雾,为我们答疑解惑,看完印象深刻,原来是这样的,之前的一些疑问顿时豁然开朗。


相信经过上面的详细阐述,这张图应该一目了然了。

  1. Function.prototypeFunction.__proto__都指向Function.prototype,这就是鸡和蛋的问题怎么出现的。
  2. Object.prototype.__proto__ === null,说明原型链到Object.prototype终止。
Function.prototype是个不同于一般函数(对象)的函数(对象)。

The Function prototype object is itself a Function object (its [[Class]] is “Function”) that, when invoked, accepts any arguments and returns undefined.

The value of the [[Prototype]] internal property of the Function prototype object is the standard built-in Object prototype object (15.2.4). The initial value of the [[Extensible]] internal property of the Function prototype object is true.

The Function prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the Object prototype Object.

Function.prototype像普通函数一样可以调用,但总是返回undefined
②普通函数实际上是Function的实例,即普通函数继承于Function.prototype。func.__proto__ === Function.prototype
Function.prototype继承于Object.prototype,并且没有prototype这个属性。func.prototype是普通对象,Function.prototype.prototypenull
④所以,Function.prototype其实是个另类的函数,可以独立于/先于Function产生。

Object本身是个(构造)函数,是Function的实例,即Object.proto就是Function.prototype。

The value of the [[Prototype]] internal property of the Object constructor is the standard built-in Function prototype object.

The value of the [[Prototype]] internal property of the Object prototype object is null, the value of the [[Class]] internal property is “Object”, and the initial value of the [[Extensible]] internal property is true.

最后总结:先有Object.prototype(原型链顶端),Function.prototype继承Object.prototype而产生,最后,FunctionObject和其它构造函数继承Function.prototype而产生。

April 14, 2017 » 7、界面之下:还原真实的MV*模式

文章图文并茂,娓娓道来,首先抛出问题,吸引读者兴趣,然后一步步讲解从MVC->MVP->MVVM,有demo,有图文,分析各自的优缺点,以及各自的出现是为了把前者缺点变成有点,让我们系统的对各种mv*有一个更真实的认知,至少看完以后,没之前抽象和神秘了。读完之后,受益匪浅,可能功力和经验还不够,对于其中的一些东西没有深入和细致的体会,还有待提高,隔一段时间回头看一次,相信收获不尽相同。

MVVM

MVVM可以看作是一种特殊的MVP(Passive View)模式,或者说是对MVP模式的一种改良。

历史背景

MVVM模式最早是微软公司提出,并且了大量使用在.NET的WPF和Sliverlight中。2005年微软工程师John Gossman在自己的博客上首次公布了MVVM模式。

ViewModel

MVVM代表的是Model-View-ViewModel,这里需要解释一下什么是ViewModel。ViewModel的含义就是 “Model of View”,视图的模型。它的含义包含了领域模型(Domain Model)和视图的状态(State)。 在图形界面应用程序当中,界面所提供的信息可能不仅仅包含应用程序的领域模型。还可能包含一些领域模型不包含的视图状态,例如电子表格程序上需要显示当前排序的状态是顺序的还是逆序的,而这是Domain Model所不包含的,但也是需要显示的信息。

可以简单把ViewModel理解为页面上所显示内容的数据抽象,和Domain Model不一样,ViewModel更适合用来描述View。

MVVM的依赖

MVVM的依赖关系和MVP依赖,只不过是把P换成了VM。

MVVM的调用关系

MVVM的调用关系和MVP一样。但是,在ViewModel当中会有一个叫Binder,或者是Data-binding engine的东西。以前全部由Presenter负责的View和Model之间数据同步操作交由给Binder处理。你只需要在View的模版语法当中,指令式地声明View上的显示的内容是和Model的哪一块数据绑定的。当ViewModel对进行Model更新的时候,Binder会自动把数据更新到View上去,当用户对View进行操作(例如表单输入),Binder也会自动把数据更新到Model上去。这种方式称为:Two-way data-binding,双向数据绑定。可以简单而不恰当地理解为一个模版引擎,但是会根据数据变更实时渲染。


也就是说,MVVM把View和Model的同步逻辑自动化了。以前Presenter负责的View和Model同步不再手动地进行操作,而是交由框架所提供的Binder进行负责。只需要告诉Binder,View显示的数据对应的是Model哪一部分即可。

这里有一个JavaScript MVVM的例子,因为MVVM需要Binder引擎。所以例子中使用了一个MVVM的库:Vue.js。

MVVM的优缺点

优点:
  1. 提高可维护性。解决了MVP大量的手动View和Model同步的问题,提供双向绑定机制。提高了代码的可维护性。
  2. 简化测试。因为同步逻辑是交由Binder做的,View跟着Model同时变更,所以只需要保证Model的正确性,View就正确。大大减少了对View同步更新的测试。
缺点:
  1. 过于简单的图形界面不适用,或说牛刀杀鸡。
  2. 对于大型的图形应用程序,视图状态较多,ViewModel的构建和维护的成本都会比较高。
  3. 数据绑定的声明是指令式地写在View的模版当中的,这些内容是没办法去打断点debug的。

April 7, 2017 » 6、javascript学习笔记(三)BOM和DOM详解

本文应用了很多实例,来解读JavaScript中BOM和DOM,DOM是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的平台和语言中立的接口。,而BOM定义了JavaScript可以进行操作的浏览器的各个功能部件的接口。

DOM(文档对象模型)是 HTML 和 XML 的应用程序接口(API)。
BOM 主要处理浏览器窗口和框架,不过通常浏览器特定的 JavaScript 扩展都被看做 BOM 的一部分。这些扩展包括:

1
2
3
4
5
6
弹出新的浏览器窗口
移动、关闭浏览器窗口以及调整窗口大小
提供 Web 浏览器详细信息的定位对象
提供用户屏幕分辨率详细信息的屏幕对象
对 cookie 的支持
IE 扩展了 BOM,加入了 ActiveXObject 类,可以通过 JavaScript 实例化 ActiveX 对象

javacsript是通过访问BOM(Browser Object Model)对象来访问、控制、修改客户端(浏览器),由于BOM的window包含了document,window对象的属性和方法是直接可以使用而且被感知的,因此可以直接使用window对象的document属性,通过document属性就可以访问、检索、修改XHTML文档内容与结构。因为document对象又是DOM(Document Object Model)模型的根节点。可以说,BOM包含了DOM(对象),浏览器提供出来给予访问的是BOM对象,从BOM对象再访问到DOM对象,从而js可以操作浏览器以及浏览器读取到的文档。其中
DOM包含:window

1
2
3
Window对象包含属性:document、location、navigator、screen、history、frames
Document根节点包含子节点:forms、location、anchors、images、links

从window.document已然可以看出,DOM的最根本的对象是BOM的window对象的子对象。
区别:DOM描述了处理网页内容的方法和接口,BOM描述了与浏览器进行交互的方法和接口。

BOM和DOM的结构关系示意图

April 2, 2017 » 5、我的前端资源汇总

工欲善其事,必先利其器

作者为我们整理了大量实用的库和框架,还有一些非常实用的插件,对于开发效率和速度的提升有极大的作用,同事也可以学习一下这些优秀开源项目的代码风格,帮助我们更好的学习JS这门语言.

Slider

slick:功能异常强大的一个图片滑动切换效果库
swipe:非常轻量级的一个图片滑动切换效果库, 性能良好, 尤其是对手机的支持, 压缩后的大小约 5kb
swiper:用于实现浏览器上的滑动切换效果,支持硬件加速
Owl:多种图片轮播效果,多选项的
flickity:轮播图效果,左右有显示一半的图片
icheck:一款漂亮的 Checkbox 插件
iscroll:高性能的滚动(scroll)处理库,功能强大,支持各种事件,不依赖任何的库,且插件丰富, 大众点评的手机端列表滚动就是用这个库处理的
Slideout.js :一个非常美观的侧滑菜单

March 29, 2017 » 4、浏览器缓存知识小结及应用

文章对浏览器的缓存做了比较深入的理解,很有条理,深入浅出,图文并茂,主要介绍了浏览器的两种缓存类型:强缓存和协商缓存.

让我对浏览器缓存有了一个基本的认识:
1
2
3
4
5
6
7
8
9
10
11
12
1)浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接
从自己的缓存中读取资源,不会发请求到服务器。比如某个css文件,如果浏览器在加载它所在的网页时,这个css文件
的缓存配置命中了强缓存,浏览器就直接从缓存中加载这个css,连请求都不会发送到网页所在服务器;
2)当强缓存没有命中的时候,浏览器一定会发送一个请求到服务器,通过服务器端依据资源的另外一些http header
验证这个资源是否命中协商缓存,如果协商缓存命中,服务器会将这个请求返回,但是不会返回这个资源的数据,而是告
诉客户端可以直接从缓存中加载这个资源,于是浏览器就又会从自己的缓存中去加载这个资源;
3)强缓存与协商缓存的共同点是:如果命中,都是从客户端缓存中加载资源,而不是从服务器加载资源数据;区别是:
强缓存不发请求到服务器,协商缓存会发请求到服务器。
4)当协商缓存也没有命中的时候,浏览器直接从服务器加载资源数据。
强缓存的原理

当浏览器对某个资源的请求命中了强缓存时,返回的http状态为200,在chrome的开发者工具的network里面size会显示为from cache.

强缓存是利用Expires或者Cache-Control这两个http response header实现的,它们都用来表示资源在客户端缓存的有效期。

Expires是http1.0提出的一个表示资源过期时间的header,它描述的是一个绝对时间,由服务器返回,用GMT格式的字符串表示,如:Expires:Thu, 31 Dec 2037 23:55:55 GMT,它的缓存原理是:

1
2
3
4
5
6
7
8
9
1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Expires的header;
2)浏览器在接收到这个资源后,会把这个资源连同所有response header一起缓存下来(所以缓存命中的请求返回的
header并不是来自服务器,而是来自之前缓存的header);
3)浏览器再请求这个资源时,先从缓存中寻找,找到这个资源后,拿出它的Expires跟当前的请求时间比较,如果请求时
间在Expires指定的时间之前,就能命中缓存,否则就不行。
4)如果缓存没有命中,浏览器直接从服务器加载资源时,Expires Header在重新加载的时候会被更新。

Expires是较老的强缓存管理header,由于它是服务器返回的一个绝对时间,在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改下客户端时间,就能影响缓存命中的结果。所以在http1.1的时候,提出了一个新的header,就是Cache-Control,这是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示,如:Cache-Control:max-age=315360000,它的缓存原理是:

1
2
3
4
5
6
7
8
9
10
1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Cache-Control
的header;
2)浏览器在接收到这个资源后,会把这个资源连同所有response header一起缓存下来;
3)浏览器再请求这个资源时,先从缓存中寻找,找到这个资源后,根据它第一次的请求时间和Cache-Control设定的有
效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓
存,否则就不行。
4)如果缓存没有命中,浏览器直接从服务器加载资源时,Cache-Control Header在重新加载的时候会被更新。
协商缓存的原理

当浏览器对某个资源的请求没有命中强缓存,就会发一个请求到服务器,验证协商缓存是否命中,如果协商缓存命中,请求响应返回的http状态为304并且会显示一个Not Modified的字符串.

查看单个请求的Response Header,也能看到304的状态码和Not Modified的字符串,只要看到这个就可说明这个资源是命中了协商缓存,然后从客户端缓存中加载的,而不是服务器最新的资源.

协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的。
【Last-Modified,If-Modified-Since】的控制缓存的原理是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的
header,这个header表示这个资源在服务器上的最后修改时间:
2)浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的
值就是上一次请求时返回的Last-Modified的值:
3)服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否
有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务
器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,因为既然资源没有
变化,那么Last-Modified也就不会改变,这是服务器返回304时的response header:
4)浏览器收到304的响应后,就会从缓存中加载资源。
5)如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified Header在重新加载的时候会被更新,下
次请求时,If-Modified-Since会启用上次返回的Last-Modified值。

March 16, 2017 » 3、图解7种耦合关系

本文图文并茂的展示了软件工程中关于耦合的一些概念,通过完整代码的展示和线上直观的演示,让人清晰明了的明白这几种耦合的不同点,以及不同耦合关系的高低

不同模块之间的关系就是耦合,根据耦合程度可以分为7种,耦合度依次变低。
  • 内容耦合
  • 公共耦合
  • 外部耦合
  • 控制耦合
  • 标记耦合
  • 数据耦合
  • 非直接耦合
内聚
  • 偶然内聚
  • 逻辑内聚
  • 时间内聚
  • 通信内聚
  • 顺序内聚
  • 功能内聚
收获:

之前对于大学软件工程上讲的为什么要做到高内聚与低耦合,以及这样的好处一直模模糊糊,知其然不知所以然,也没有一个深入清晰的认知,通过这篇文章,让我大致了解几种耦合的异同,以及低耦合带来的优势,让自己对这一块有更进步的理解和深入。

JavaScript高内聚的心法:
  • 仅处理自己
    仅调用自己的方法
    不能访问外部dom节点
    不能访问全局变量

  • 仅发出消息

  • 不要制造垃圾
    不能创建全局变量

  • 不要和陌生人说话
    不要直接和其他模块通信

March 11, 2017 » 2、关于Object的getter和setter

文章先抛出问题,引发读着的好奇心,然后先给大家普及关于Objectgettersetter的一些概念和特性,几个简单的例子让我清晰明了的认知Objectgettersetter的特性,进一步理解了这两个特殊的“属性”的妙处

问题是这样的:

对于对象o有N个属性,不修改下面代码,编写一段程序获取到对象o的所有属性。

1
2
3
4
5
6
7
8
9
10
var foo = (function(){
var o = {
a: 1,
b: 2,
/**更多属性**/
};
return function(key) {
return o[key];
}
})();

答案也很巧妙:

1
2
3
4
5
6
7
8
Object.defineProperty(Object.prototype, 'self', {
get() {
return this;
}
});
var o = foo('self');
console.log(Object.keys(o)); // ['a', 'b']

收获:对Objectgettersetter有更进一步的了解,为以后自己去理解vue.js的双向数据绑定打下了基础,我记得vue.js的双向数据绑定的原理就是Objectgettersetter方法然后就是结合发布订阅的设计模式,以后一定自己好好实现以下,同时对原型链这一块有加深了印象,还需要继续学习。

March 8, 2017 » 1、JavaScript中的内存释放

文章简单易懂,图文结合,清晰明了,娓娓道来,跟着作者的思绪一点点拨云见雾,真相大白。

收获:让我彻底明白了这这两个题其中的原理。

1
2
3
4
5
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000 * i);
}

当初只是因为这个由于是闭包,所以可以输出出1,2,3,4,5,后来为什么这么样我就没去深究了。

1
2
3
4
5
6
7
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}

直到看了这篇文章JavaScript中的内存释放,让我更加清晰明了的明白了作用域和JavaScript中的内存释放的一些原理和机制,明白了在一个私有作用域中,给DOM元素绑定方法,私有作用域不能被销毁的原理。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少,买房就差你们打赏之外那部分钱

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. April 28, 2017 » 12、老生常谈-从输入url到页面展示到底发生了什么
    1. 1.0.1. April 26, 2017 » 11、深入浅出Javascript事件循环机制(上)
    2. 1.0.2. April 22, 2017 » 10、CSRF 攻击的应对之道
    3. 1.0.3. 为了惩罚自己,自己默写一下CSRF的定义:
    4. 1.0.4. 有哪些防御方案?
    5. 1.0.5. April 22, 2017 » 9、每日一题系列
    6. 1.0.6. April 18, 2017 » 8、从proto和prototype来深入理解JS对象和原型链
      1. 1.0.6.0.1. Function.prototype是个不同于一般函数(对象)的函数(对象)。
      2. 1.0.6.0.2. Object本身是个(构造)函数,是Function的实例,即Object.proto就是Function.prototype。
  2. 1.0.7. April 14, 2017 » 7、界面之下:还原真实的MV*模式
    1. 1.0.7.1. MVVM
    2. 1.0.7.2. 历史背景
    3. 1.0.7.3. ViewModel
    4. 1.0.7.4. MVVM的依赖
    5. 1.0.7.5. MVVM的调用关系
    6. 1.0.7.6. MVVM的优缺点
      1. 1.0.7.6.1. 优点:
      2. 1.0.7.6.2. 缺点:
  3. 1.0.8. April 7, 2017 » 6、javascript学习笔记(三)BOM和DOM详解
  4. 1.0.9. April 2, 2017 » 5、我的前端资源汇总
    1. 1.0.9.1. Slider
  5. 1.0.10. March 29, 2017 » 4、浏览器缓存知识小结及应用
    1. 1.0.10.0.1. 让我对浏览器缓存有了一个基本的认识:
    2. 1.0.10.0.2. 强缓存的原理
    3. 1.0.10.0.3. 协商缓存的原理
  • 1.0.11. March 16, 2017 » 3、图解7种耦合关系
    1. 1.0.11.0.1. 不同模块之间的关系就是耦合,根据耦合程度可以分为7种,耦合度依次变低。
    2. 1.0.11.0.2. 内聚
    3. 1.0.11.0.3. 收获:
    4. 1.0.11.0.4. JavaScript高内聚的心法:
  • 1.0.12. March 11, 2017 » 2、关于Object的getter和setter
  • 1.0.13. March 8, 2017 » 1、JavaScript中的内存释放
  • ,