IT技术博客大学习 共学习 共进步
首页 / 颜海镜
IT 2015-01-22 23:29:37 / 累计浏览 2,960

10条影响CSS渲染速度的写法与建议

这篇文章聚焦于CSS的渲染性能,作者从日常编码中常见的写法入手,剖析了10种可能导致浏览器渲染变慢的习惯。 文章开篇就直指通配符选择器`*`的滥用,它会遍历所有标签,是性能的一大隐患。接着,作者犀利地指出了IE滤镜(如实现灰色效果的`filter: gray`)的高资源消耗问题,并以汶川地震时大量网站变灰导致CPU飙升的实际案例佐证。此外,诸如过度使用绝对定位、背景图片平铺策略不当、CSS选择器路径过深等影响渲染链效率的写法,也都被一一拆解。 对于每个问题,作者都提供了务实的替代方案,比如针对通配符,建议改为对常用标签(body, li等)单独重置;对于背景平铺,则建议将色彩少的图片制成尺寸稍大的GIF格式。文章强调,合理的布局和让属性通过继承传递,能从根本上优化渲染路径。这些经验之谈,源于作者在真实项目中遇到的性能瓶颈,为前端开发者提供了清晰的避坑指南。

IT 2015-01-22 23:28:52 / 累计浏览 1,900

CSS3中的网格

这篇讲的是CSS布局从“一团糟”到初现曙光的演进史。作者从早年开发者们不得不依赖表格、浮动和inline-block这些“hack”方法来实现多列布局说起,深入剖析了其中的核心痛点:浮动需要 clearfix、盒模型计算导致宽度溢出、以及为列间距疲于奔命。 文章并未停留在抱怨历史,而是把重点放在了CSS3带来的三把“钥匙”上。它逐一演示了如何用 `box-sizing: border-box` 让宽度计算回归直觉,如何用 `calc()` 函数在百分比中精确扣除间距,以及 Flexbox 如何以更声明式的方式简化对齐与分布。每个方案都附带了清晰的代码示例和效果对比,直观展示了布局效率的提升。 当然,作者也没有回避现实。他指出 `border-box` 仍需搭配浮动,`calc()` 依赖负外边距这种老技巧,而 Flexbox 虽好却受制于当时的浏览器支持。这种客观的对比,让读者能清醒地认识到每个工具的适用边界。对于正挣扎于布局细节的开发者而言,这篇文章清晰地指明了哪些新特性值得立即投入学习,以及它们能实实在在解决哪类历史问题。

IT 2015-01-21 23:51:49 / 累计浏览 2,980

Javascript继承-原型的陷阱

这篇讲的是JavaScript原型继承中一个经典的“实例属性共享陷阱”。作者从一个简单的Widget父类和SubWidget子类出发,展示了当使用`SubWidget.prototype = new Widget()`设置继承后,所有子类实例会意外地共享同一个`messages`数组——比如给sub1和sub2分别push消息,结果它们的数组内容完全相同。 问题的根源在于,通过`new Widget()`创建的原型对象中,`messages`数组只初始化了一次,所有实例都指向原型上的同一份数据。作者用清晰的对象关系图逐步揭示了这一过程:原型上的共享属性,如何在实例操作时相互影响。 解决方法是在子类构造函数中调用`Widget.apply(this, arguments)`,借用父类构造函数在每个实例的上下文中初始化属性。文章还补充了两点优化:调整调用顺序以避免子类属性被覆盖,以及直接使用`SubWidget.prototype = Widget.prototype`避免父类构造函数重复执行。这些细节让这个“踩坑-解坑”的过程更具实操参考价值。

IT 2015-01-21 23:46:20 / 累计浏览 3,700

高效jQuery的奥秘

这篇文章系统梳理了提升jQuery与JavaScript代码性能的实战技巧,核心观点是:好的代码规范直接带来速度提升,而更快的渲染与响应能显著优化用户体验。作者从“jQuery本质就是JavaScript”这一前提出发,强调应遵循相同的编码最佳实践。 文中列举了多项具体优化措施,并辅以代码对比。例如,通过缓存DOM元素减少昂贵的遍历操作,为jQuery对象使用匈牙利命名法($前缀)以增强代码可读性,以及将分散的var声明合并为单条语句。在事件处理上,推荐统一使用`.on()`方法;在代码组织上,则提倡链式操作与适当的格式化以兼顾简洁与可维护性。 文章进一步深入选择器优化层面,指出应避免使用通用选择符(如`*`),而是利用`.children()`等更高效的方法;同时强调ID选择符的唯一性,无需添加冗余的父级选择符。此外,诸如短路求值、分离元素进行批量操作等JavaScript通用技巧,也被融入jQuery的使用场景中加以说明。 总体来看,这并非泛泛而谈的理论,而是一套源自实践的“编码惯例”清单,旨在帮助开发者通过养成良好的编码习惯,从细节处挖掘出jQuery应用的性能潜力。

IT 2015-01-21 23:45:41 / 累计浏览 3,000

JavaScript里的依赖注入

在JavaScript开发中,随着项目复杂度上升,模块间的依赖管理常常成为痛点。这篇文章从“如何优雅地解耦和替换模块依赖”这一实际问题出发,深入探讨了依赖注入的几种实现方案。 作者首先展示了一个硬编码依赖的例子,并由此引出依赖注入需要达成的目标,比如保持函数作用域、支持自定义参数等。文章详细分析了两种主流思路:一种是模仿RequireJS的显式声明方式,需要在注入器中按顺序注册依赖名;另一种是借鉴Angular的反射方法,通过解析函数参数名来自动匹配,这虽然更灵活,却存在一个致命缺陷——代码压缩会破坏参数名映射。 作者并没有止步于对比。为克服单一方案的局限,文章最后提出了一个结合两者优点的自定义注入器实现:既支持通过字符串列表显式声明依赖,也能尝试基于参数名的反射匹配,从而兼顾灵活性与生产环境的兼容性。整个探索过程逻辑清晰,从问题定义到方案演进,为读者提供了在实际项目中处理依赖关系的具体思路。

IT 2015-01-21 23:44:49 / 累计浏览 16,620

我的 Sublime Text 2 笔记

这篇笔记记录了一位长期使用Aptana的开发者,因工作需要转向Sublime Text 2后的真实上手过程与心得。作者坦言,初次接触便被其秒开的启动速度、干净简洁的界面以及“无干扰”的编辑体验所吸引。 为了高效驾驭这款新工具,作者遵循“工欲善其事,必先利其器”的原则,展开了一番针对性研究。文章的核心,是作者按照80/20法则总结出的一组最常用的快捷键。从用 `Ctrl+P` 快速搜索文件、`Ctrl+Shift+P` 打开命令面板,到使用 `Ctrl+L` 逐行选择、`Ctrl+M` 跳转括号,这些快捷键覆盖了文件导航、代码编辑、文本选择和面板操作等高频场景。 作者没有罗列全部功能,而是专注于能解决80%日常编码需求的关键操作,这种务实的思路让这篇笔记本身也成为了一种高效的“工具”,帮助其他开发者快速掌握Sublime Text的核心操作逻辑。

IT 2015-01-21 23:43:40 / 累计浏览 2,720

JavaScript的作用域和提升机制

这篇讲的是 JavaScript 开发者经常踩坑的两个核心机制:作用域与提升。作者从一个看似矛盾的代码案例切入——明明声明了变量,输出却不符合直觉,从而引出语言设计的底层逻辑。 文章清晰地区分了 JavaScript 的“函数级作用域”与 C 族语言的“块级作用域”,指出前者是许多混淆的根源。随后深入剖析了“提升(Hoisting)”机制,说明 JavaScript 解释器会将变量声明和函数声明“无形中移动”到作用域顶部,但仅声明部分被提升,赋值则保留在原位。对于函数,整个函数体会被提升,但通过函数表达式(如 `var foo = function(){}`)声明的则只有变量名被提升。 作者还探讨了名字解析顺序的细节,例如函数声明优先于变量声明,以及命名函数表达式的特殊行为。最后给出了实用编码建议:始终使用 `var` 显式声明,并推荐采用单 var 模式与 JSLint 检查,以规避潜在问题。整篇文章从迷惑现象出发,追溯语言标准解释,最终落脚于清晰、健壮的编码实践。

IT 2015-01-21 23:42:41 / 累计浏览 2,120

每一个JavaScript开发者应该了解的浮点知识

这篇讲的是JavaScript开发者几乎都会遇到的“经典困惑”:为什么`0.1 + 0.2`的结果不等于`0.3`?文章从最基础的数字表示出发,解释了问题的根源。 作者指出,我们日常使用的十进制小数,在计算机内部是以二进制浮点数存储的。例如十进制的`0.1`,在二进制中是一个无限循环小数(`0.00110011...`)。由于计算机存储位数有限(JavaScript使用IEEE 754双精度,尾数位为52位),必须进行舍入,这就带来了无法消除的精度误差。 文章进一步拆解了IEEE 754标准的64位结构:1位符号位、11位指数位和52位尾数位。正因如此,`0.1 + 0.2`在二进制层面的计算结果并非精确的`0.3`,而是带有微小误差,导致直接比较返回`false`。 面对这个“数字表示的固有缺陷”,作者不建议自己发明轮子。他提到,一个常见的思路是将数值存储为整数(如将美元转为美分),但这在处理非十进制货币时并不通用。更推荐的方案是借助专门的数学库(如math.js)来处理需要精确计算的场景。对于格式化显示,`toPrecision()`和`toFixed()`方法有用,但需牢记它们返回的是字符串,不能直接用于后续的算术运算。

IT 2015-01-21 23:42:04 / 累计浏览 2,900

重温CSS:Border属性

这篇文章重新审视了 CSS 的 border 属性,作者指出它远不止 `1px solid black` 这么简单。文章从最基础的复合属性与单属性拆分讲起,重点展示了拆分属性(如 `border-color`)在状态切换时的优雅之处,并为后文的高级技巧埋下伏笔。 核心篇幅则聚焦于 `border-radius` 这一 CSS3 特性。作者不仅回顾了其基本用法和分角设置,更演示了如何通过组合不同角的圆角值,创造出如“柠檬”形状这样的自定义图形,摆脱了对背景图像或切图的依赖。这部分内容生动体现了 CSS 的设计潜力。 在扩展部分,文章开始介绍边的更多玩法,例如设置不同的边框样式(`border-style`)。整体而言,这篇“重温”不仅巩固了基础,更揭示了简单属性背后的灵活创造力,让读者对这个最熟悉的属性有了新的认识。

IT 2015-01-21 23:40:47 / 累计浏览 1,880

JavaScript对象继承一瞥

这篇讲的是JavaScript中如何用构造函数实现对象继承。作者从早期模仿Java的构造函数模式出发,指出了其内存浪费的问题,从而引入了原型链机制。 文章随后展开了对几种经典继承模式的剖析与对比。它先展示了最常用的“默认模式”(将子类原型设为父类实例),并一针见血地指出了其三个缺点:子类实例无法继承父类属性、污染子类原型、constructor属性丢失。 为了解决这些问题,作者逐步介绍了“借用构造函数”(使用call方法复用父类构造逻辑)、“共享原型”(直接共享父类原型,避免实例属性污染)以及“临时构造函数”(创建空函数作为中间层,既隔离原型又不影响父类)等方案。 最终,文章将这些思路整合,给出了一个被称为“圣杯”的综合解决方案。这个模式清晰地展示了如何优雅地在保留原型继承优点的同时,规避其典型陷阱。整体上,文章清晰地梳理了JavaScript继承这一核心概念的演进逻辑与实践细节,参考了《JavaScript模式》一书,并带着作者自己的学习目的。

IT 2015-01-20 23:40:21 / 累计浏览 3,420

认识javascript中的作用域和上下文

这篇讲的是JavaScript中作用域和上下文这两个常被混淆却至关重要的核心概念。作者首先澄清,作用域是函数调用时变量的可访问范围,每次调用独立;而上下文主要指this关键字的值,取决于函数的调用方式。 文章深入剖析了两者的差异与关联:局部与全局变量的作用域区别,并指出ES6的let带来了块级作用域;this在不同调用场景(对象方法、new创建实例、默认调用、严格模式)下的不同绑定结果。作者还详解了执行上下文与作用域链的机制,说明变量查找如何沿链上溯。 在此基础上,文章展示了这些概念如何支撑JavaScript的高级模式。闭包通过维持对外部函数作用域的引用实现数据封装,并衍生出模块模式和IIFE(立即调用函数表达式)来保护全局命名空间。而call、apply和bind方法则提供了动态控制函数执行上下文的能力,在面向对象编程和事件处理中解决上下文丢失问题。 对于想深入理解JavaScript语言机制和设计模式的开发者而言,厘清作用域与上下文是绕不开的关键一步。

IT 2015-01-20 23:34:42 / 累计浏览 2,220

有趣的JavaScript原生数组函数

这篇讲的是 JavaScript 中那些原生数组方法的深度探索与趣味应用。文章没有停留在基础的 `for` 循环,而是系统梳理了数组原型上一系列强大而实用的方法。作者从数组创建的基本概念(如 `typeof` 返回 “object” 与 `instanceof Array` 的区别)切入,为后续理解铺平了道路。 接下来,文章像一份精选菜单,逐一剖析了每个方法的用途和细微差别。你不仅能复习 `forEach`、`map`、`filter` 这些循环与转换利器,还能深入理解 `some` 与 `every` 在条件判断上的逻辑分野。对于像 `join`(字符串化)与 `concat`(合并)这样容易混淆的操作,文章厘清了它们的核心差异。同时,它涵盖了模拟栈与队列操作的 `pop`、`push`、`shift`、`unshift`,用于数据规约的 `reduce`,以及负责元素增删查改的 `slice`、`splice` 和 `indexOf`。甚至 `in` 操作符与 `reverse` 这类小工具也被纳入讨论范围。 这不仅仅是一份 API 列表。作者将每个方法置于实际场景中,探讨了它们如何让数据处理变得更简洁、更声明式。如果你想跳出死记硬背,真正理解这些内置函数如何提升代码的优雅度与执行效率,这篇文章提供了一个扎实且有趣的视角,建议你在阅读后打开浏览器控制台亲手试试。

IT 2015-01-20 23:33:04 / 累计浏览 4,880

在JavaScript中什么时候使用==是正确的?

这篇讲的是JavaScript中==和===操作符的正确使用场景。作者从初学者的常见建议出发,深入剖析了为什么即使在一些看似合理的场合,也应该坚持使用严格相等===。文章核心对比了两种操作符的关键差异:==在比较前会进行隐式类型转换,而===直接比较值和类型,不进行转换。 作者列举了五个具体案例来论证观点。例如,在与undefined和null比较时,`x == null`虽然能同时检测两者,但意图不够清晰,可能让

IT 2015-01-20 23:31:04 / 累计浏览 4,300

了解JavaScript的执行上下文

这篇讲的是JavaScript里一个常被提及却少有人深究的概念——执行上下文。文章从代码运行时的三种执行环境(全局、函数、eval)入手,指出执行上下文本质上就是当前代码的“作用域环境”。 作者没有停留在定义上,而是用图示清晰地展示了执行栈如何管理这些上下文:浏览器作为单线程,会将全局上下文作为初始栈帧,每次调用函数就压入一个新的栈帧,函数执行完毕再弹出。这个机制解释了代码的执行顺序和异步事件排队的原理。 文章的核心价值在于深入执行上下文内部,剖析了它被创建时的两个阶段。尤其在“创建阶段”,解释器会预先扫描并初始化变量对象(AO/VO),将函数声明完整提升,而将变量声明初始化为 undefined。这就从根源上解释了“变量提升”和“函数声明可提前使用”这些常见现象的背后机制,而不仅仅是告诉读者一个规则。

IT 2015-01-20 23:29:46 / 累计浏览 20,140

我的git笔记

这篇讲的是作者从 SVN 转向 Git 并深度使用后,沉淀下来的一份实用命令手册。作者从两年前通过《GotGitHub》入门 GitHub 讲起,分享了自己从最初使用 GitHub for Windows 图形客户端被自动换行符问题困扰,到后来通过学习《Git详解》系列文章转入命令行的进阶过程。 如今作者已在 GitHub 上开源了 60 多个项目,为了在这些项目间高效穿梭,也为了自己“用时能快速查阅”,他系统地梳理了 Git 的常用命令。文章按使用场景分类,涵盖了安装配置、新建与克隆仓库、本地文件增删改查、分支的创建合并与变基、远端操作、多源管理以及标签管理等方方面面。 特别值得一提的是,作者不仅列出了核心命令,还补充了像 `git revert` 和 `git stash` 这样实用但容易记混的操作细节,并在最后附上了包括《Pro Git》、《图解Git》在内的八份经典参考资料。整篇文章就像一个经验丰富的开发者在跟你分享他的“私人笔记”,对于需要快速回顾或查询 Git 命令的读者来说,是一份非常顺手的速查指南。

IT 2015-01-14 13:38:23 / 累计浏览 1,240

函数式 CSS

这篇讲的是如何将函数式编程的核心思想——比如不可变性和组合性——应用到传统上“全局且可变”的CSS开发中。作者从Wealthfront工程团队的实践出发,指出CSS的全局作用域、样式易被覆盖和与DOM结构紧耦合等问题,会带来意想不到的样式冲突和维护噩梦。 文章给出的核心方案是“函数式CSS”风格指南。其关键在于通过严格的命名约定为类名添加前缀,从而模拟出作用域,隔离样式;同时倡导使用组合(如同时应用多个类或Sass的@extend指令)来扩展样式,而不是重写已有的规则。这样既能避免副作用,又能提升样式的可复用性。 作者通过对比修改前后的代码实例,展示了如何减少样式依赖、增强组件独立性。最终目标是让样式表变得更具伸缩性、更少“意外”,即使在大型项目中也能保持可维护性。对于任何受困于CSS全局混乱的前端团队,这套实践提供了清晰的约束思路和改进路径。

IT 2015-01-14 13:35:54 / 累计浏览 2,320

函数要多小才够好——谈小函数之道

作者从“函数设计的本质是内聚”这一共识出发,深入探讨了一个常被忽视但至关重要的实践细节:函数到底应该写多长、多小才算好。文章指出,函数的“小”并非目的,而是其内聚性与可读性的外在表现。 为此,作者提出了一个核心衡量标准:“代码最小处理单元”。他将一次赋值、一次比较乃至一次函数调用视为一个单元,并基于人脑认知负荷(不超过7个单位),建议单个函数内的最小处理单元也应控制在7个以内。这为“多小”提供了一个可操作的参考尺度。 作者进一步分享了四个明确的拆分信号:函数过长无法一览无余、局部变量超过七个、缩进嵌套层级过多,以及最重要的——函数内部代码处于不同的抽象层次。他通过一个初始化函数的改造示例,清晰展示了如何将混杂的底层细节封装成更小的、抽象单一的函数。 文章的点睛之笔在于,它定义了小函数的“下限”与“意义”。哪怕函数体只有一行代码,如经典的 `int max(a, b)`,其存在的价值在于通过函数名将具体逻辑抽象为意图清晰的“做什么”,在调用处极大地降低了阅读者的认知成本。文末,作者建议开发者多尝试编写10行以内的短小函数,逐步体会其带来的清晰与可维护性的“大威力”。

IT 2015-01-05 23:36:09 / 累计浏览 3,620

写了10年Javascript未必全了解的连续赋值运算

这篇讲的是连续赋值运算符“=”在JavaScript中一个反直觉的表现。作者从阅读jQuery源码时遇到的一行代码 `a.x = a = {n:2}` 出发,对它的执行顺序和内部机制产生了好奇。代码中,初始 `a` 指向 `{n:1}`,执行后 `a.x` 为 `undefined`,这个结果并不直接。 作者首先提出了两种常见的错误猜想:一种认为是从左到右赋值,另一种认为是从右到左但引擎会阻止赋值。为了验证,他引入了一个关键变量 `b` 来持有 `a` 的原始引用。实验结果令人惊讶:`a.x` 仍为 `undefined`,但 `b.x` 却变成了 `[object Object]`。这说明 `a.x = {n:2}` 这个赋值实际上执行了,只是发生在 `a` 被重新赋值之前。 文章揭示的核心机制是:该表达式被引擎解释为 `a.x = (a = {n:2})`。首先,最右边的 `a = {n:2}` 执行,使 `a` 指向新对象;然后,这个新值 `{n:2}` 被赋给左边 `a.x` 中的 `a`。关键在于,左边的 `a.x` 在表达式求值时,其引用(指向原对象 `{n:1}`)已被锁定,因此赋值操作作用于原对象,而非新对象。作者用箭头图示清晰地展示了这一引用分裂现象。 文章最后还以一个函数中 `var a = b = 5` 导致 `b` 泄漏为全局变量的例子,延伸了连续赋值的另一个常见陷阱。整篇文章通过对一个细节的深度追问,澄清了连等赋值的真实执行路径与引用关系的变化。

IT 2015-01-05 23:34:46 / 累计浏览 7,080

为什么++[[]][+[]]+[+[]]=10?

这篇讲的是JavaScript中一个令人费解的表达式++[[]][+[]]+[+[]]为何能成功计算并返回"10"。文章从这个看似荒诞的等式出发,带领读者深入理解JavaScript底层的一系列特性:一元加运算符的强制类型转换、数组的隐式字符串拼接,以及自增运算符的优先级。作者将这个天书般的表达式层层拆解,从+[]变为0,到数组访问和自增操作,最终揭示1与字符串"0"的拼接过程。最巧妙的是,文章没有停留在表面解释,而是清晰地展示了JavaScript在处理隐式转换时那些违反直觉却符合规范的行为,让原本晦涩的规则变得具体可感。这不仅是一次对特定表达式的解构,更是一次对语言本质特性的生动展示。

IT 2015-01-05 23:32:25 / 累计浏览 2,360

如何构建优质代码

这篇讲的是如何编写出高质量、易维护的代码。作者从实际工程经验出发,总结了10条核心原则。 他开篇就强调了DRY(不要重复自己)的重要性,并举了单元测试中违反此原则会导致维护成本剧增的例子。文章还指出,写出短小的方法、采用能“望文生义”的命名规范,能让代码更易读和重用。 在设计层面,文章建议让每个类只承担“正确的”职责,并注重接口的稳定性而非实现细节。为了保障质量,作者大力推荐编写大量的单元测试,并以此为安全网,进行小步、持续的代码重构。 最后,他提到了一个颇具争议的观点:比起写糟糕的注释,不如花时间重构代码使其更清晰。同时,强调了代码审查机制对于发现错误和共享知识的价值,但要求审查者能力合格,并对代码负责。 这些原则共同指向一个目标:编写出更健康、更易于协作和演进的软件。