【译】CSSOM介绍

原文链接:点击 作者:Patrick Sexton 什么是CSSOM? CSSOM是CSS Object Model的缩写 大体上来说,CSSOM是一个建立在web页面上的 CSS 样式的映射 它和DOM类似,但是只针对CSS而不是HTML 浏览器将DOM和CSSOM结合来渲染web页面 CSSOM对于页面渲染起着至关重要的作用。 CSSOM是critical rendering path的基本和核心,并且,它会有助于我们理解web性能优化中的原理。 CSSOM是做什么的? CSSOM将样式表中的规则映射到页面对应的元素上。 虽然CSSOM采取了复杂的措施来做这件事,但是CSSOM最终的功能还是将样式映射到它们应该对应的元素上去。 更确切地说,CSSOM识别tokens并把这些tokens转换成一个树结构上的对应的结点。所有结点以及它们所关联的页面中的样式就是所谓的CSS Object Model ...

February 16, 2017 · 1 min · Xinyu

谈一谈JavaScript继承

最近在复习一些JavaScript基础的东西,碰到js的原型和继承这一块总是感觉不悟其中精髓。因此,这篇文章算是从我自己理解的角度对js继承进行总结和剖析。 什么是继承 大多数人使用继承不外乎是为了获得这两点好处,代码的抽象和代码的复用。 代码的抽象就不用说了,交通工具和汽车这类的例子数不胜数,在传统的OO语言中(比如Java),代码的抽象更多的是使用接口(interface)来实现,而使用继承更多地是为了代码的复用(虽然现在强调使用组合而不是使用继承)。 怎么复用的?打个比方,class A 继承了 class B,class A便拥有了class B 的public 和 protected类型的变量和方法,用最简单的方法去想,便是 class B 将 这些属性和方法直接copy给class A,这样便实现了继承。 因此我们可以这样说,继承实际上是一种类与类之间的copy行为。 ...

February 10, 2017 · 2 min · Xinyu

第四章混合对象"类"

类理论 类/继承描述了一种代码组织形式,类和继承是对真实世界中事物的抽象和建模。 类意味着复制,传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会被 复制到子类中 “类设计模式” 类其实是一种软件设计模式,是一种可选的代码抽象。 JavaScript中的"类" JavaScript中并没有真正的类,只有近似类的语法, 因为JavaScript并不会像类那样自动创建对象 的副本。 ...

December 29, 2016 · 1 min · Xinyu

第三章对象

语法 对象有两种定义形式:声明形式和构造形式 声明形式: 1 var obj = {} 构造形式: 1 var obj = new Object() 类型 在JavaScript中共有6种基本类型(现在是7种) string number boolean null undefined object 还有一种symbol类型 简单基本类型并不是对象,虽然typeof null === 'object',但是这个语言的一个bug ...

December 27, 2016 · 2 min · Xinyu

第二章this全面解析

绑定规则 this的绑定规则总结起来总共有四种: 默认绑定 隐式绑定 显式绑定 new绑定 默认绑定 这条规则是无法应用其它绑定时的默认规则,思考以下代码: 1 2 3 4 5 6 function foo() { console.log(this.a) } var a = 2 foo() // 2 ...

December 22, 2016 · 2 min · Xinyu

第一章关于this

为什么要用this this保存着上下文对象,避免显式地传递上下文对象 this到底是什么 this是在运行时绑定的,并不是在编写时绑定的,它的的上下文取决于函数调用时的各种条件,this的绑定和函数声明的位置没有任何关系, 只取决于函数的调用方式。

December 22, 2016 · 1 min · Xinyu

第五章作用域闭包

实质问题, 闭包的定义 当函数访问并记住所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 (个人理解)闭包并没有什么神奇的,闭包是词法作用域的特性,函数能够保存它本身的词法作用域的变量是肯定的, 即使这个函数嵌套在另一个函数里面也不例外。 循环和闭包 闭包用来保存循环变量的值,每一次循环都创建一个副本。 如下代码: 1 2 3 4 5 6 7 for(var i=1; i<=5; i++) { (function(j) setTimeout(function timer(){ console.log(j) }) {})(i) } 模块 可以利用闭包去构建模块,封装私有属性和方法,然后暴露给外部方案修改内部的属性。

December 22, 2016 · 1 min · Xinyu

第四章提升

什么是提升 所有的声明(变量或者函数声明)会被移动到各自作用域的最顶端,这个过程被称作"提升",提升的过程是发生在代码被执行之前的编译阶段, 无论作用域的声明出现在什么地方,都将在代码被执行之前首先处理。 var a = 2 问题 1 2 3 a = 2 var a console.log(a) // 2 可以看到,编译时变量a被提升,此处打印出2 另一个例子 1 2 console.log(a) // undefined var a = 2 以上代码等价于: 1 2 3 var a console.log(a) a = 2 打印出a是undefined是显而易见的 ...

December 21, 2016 · 1 min · Xinyu

第三章函数作用域和块作用域

函数作用域 JavaScript具有函数作用域,主要具有这几点好处: 隐藏内部实现,符合软件设计中的最小特权原则。 规避冲突。函数作用域可以当做命名空间隐藏变量,避免暴露到全局作用域发生冲突。 块作用域 虽然函数作用域是JavaScript中最常见的作用域单元,但块作用域在JavaScript中也是存在的,只不过(个人理解)JavaScript中的块作用域只是针对块中的某个变量 来说的。 ...

December 21, 2016 · 1 min · Xinyu

第二章词法作用域

什么是词法作用域 简单来讲,词法作用域就是定义在词法阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里决定的。 遮蔽效应 作用域查找会在找到第一个匹配的标识符时停止,在多层嵌套的作用域中可以定义同名的标识符,这叫做"遮蔽效应" 欺骗词法 欺骗词法作用域会导致性能下降 eval eval 可以对一段包含代码的字符串进行演算,并借此来修改词法作用域。 非严格模式下,eval会对其所在的词法作用域进行修改,严格模式下,其有自己的词法作用域,不会对所在的词法作用域造成修改。 ...

December 21, 2016 · 1 min · Xinyu