我喜欢到一些大型网站上去翻阅它们的原代码,期望能找到一些可以应用到自己的代码中的模式,或发现一些之前从未听说过的工具和技巧。可是,在我查看这些大型网站的源代码时,经常会发现一个问题,那就是重复的代码执行,重复的功能应用。下面就是一些在查看它们的源代码时发现一些问题,把这些分享给大家,希望能让你们更加简洁高效的写出JavaScript代码。
重复的收集元素
我在他们的JavaScript代码里看到的最常见的问题是重复的收集元素。虽然jQuery选择器引擎或querySelectorAll
的执行速度都很快,但重复的工作就是会多占用时间和资源。这个问题很浅显,解决的方法如下:
2 |
$$( ".items" ).addClass( "hide" ); |
4 |
$$( ".items" ).removeClass( "hide" ); |
7 |
var items = $$( ".items" ); |
对那些写出重复执行代码的程序员的谴责我们天天都在做,但仍需要加强。当然,有些重复的动作是无法避免的(比如ajax加载页面),可是,对于这些情况,我们最好是使用事件代理,而不是直接拉取内容。
重复的条件判断
重复的条件计算很常见,但通常也是有一个通用的模式来避免它们。你可能会看到一段代码写成这样:
01 |
var performMiracle = function () { |
03 |
if (features.someFeature) { |
这是可行的,但不是最高效的代码,上面的条件可能会多次计算。写成下面的样子会更好:
1 |
var performMiracle = features.someFeature ? function () { |
只有一个条件,而且条件计算完成时方法或变量就已经作为结果返回了!
重复的对象创建
相比较重复的操作,重复的对象创建更难发现,通常是表现在正则表达式上。看一下下面的这段代码:
1 |
function cleanText(dirty) { |
3 |
clean = dirty.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, "" ); |
5 |
// Do some more cleaning, maybe whitespace, etc. |
上面的代码会不断的重复创建一个新的(但是相同的)正则表达式对象,对于这种情况,如果你在这个函数的外部创建这个对象,就能避免这种情况的出现:
1 |
var scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; |
2 |
function cleanText(dirty) { |
3 |
// Get rid of SCRIPT tags |
4 |
clean = dirty.replace(scriptRegex, "" ); |
6 |
// Do some more cleaning, maybe whitespace, etc. |
在上面的例子中,正则表达式对象只创建了一次,但多次使用——省了很多CPU处理。
这只是一部分我经常看到的其它程序员写的有重复问题的例子,你也有这方面的发现吗?
(英文:JavaScript: Avoiding Repeated Work.)
来自:http://www.webhek.com/javascript-optimization/
- 使用定时器实现JavaScript的延期执行或重复执行
使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前 ...
- 【JavaScript】使用定时器实现Js的延期执行或重复执行setTimeout,setInterval
使用定时器实现JavaScript的延期执行或重复执行 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可 ...
- JS流程控制语句 反反复复(while循环) 和for循环有相同功能的还有while循环, while循环重复执行一段代码,直到某个条件不再满足。
反反复复(while循环) 和for循环有相同功能的还有while循环, while循环重复执行一段代码,直到某个条件不再满足. while语句结构: while(判断条件) { 循环语句 } 使用w ...
- JavaScript代码是怎么执行的?
前言 众所周知,JavaScript是单线程语言.所以JavaScript是按顺序执行的! 先编译再执行 变量提升 请看下面的例子: console.log(cat) catName("Ch ...
- javascript常用代码大全
http://caibaojian.com/288.html 原文链接 jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...
- javascript的预编译和执行顺序
原文:javascript的预编译和执行顺序 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 代码一<html> ...
- JavaScript standard 代码规范的全文
这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. 细则 使用两个空格进行缩进. eslint: indent function hel ...
- js定时器(执行一次、重复执行)
代码如下: <script> //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = ...
- 前端性能优化:细说JavaScript的加载与执行
本文主要是从性能优化的角度来探讨JavaScript在加载与执行过程中的优化思路与实践方法,既是细说,文中在涉及原理性的地方,不免会多说几句,还望各位读者保持耐心,仔细理解,请相信,您的耐心付出一定会 ...
随机推荐
- 【Mysql To EF】codefirst连接问题提供程序未返回 ProviderManifestToken 字符串
连接字符串写错导致,修改后OK. 原来的: <connectionStrings> <add name="EFDbContext" connectionStrin ...
- OOD沉思录 --- 继承
一,继承只应被用来为特化层次结构建模 实际上也就是要满足LSP原则,水果类<-榴莲的继承是特化 二,派生类必须知道他们的基类,基类不应当知道他们的派生类 复用的前提 三,基类中的所有 ...
- POJ 1976 A Mini Locomotive
$dp$. 要求选择$3$个区间,使得区间和最大.$dp[i][j]$表示前$i$个数中选择了$j$段获得的最大收益. #include <cstdio> #include <cma ...
- Django实现单用户登录
最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了.今天由于工作需求,需要用Django实现单用户登录.大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数 ...
- scrapy抓取拉勾网职位信息(七)——实现分布式
上篇我们实现了数据的存储,包括把数据存储到MongoDB,Mysql以及本地文件,本篇说下分布式. 我们目前实现的是一个单机爬虫,也就是只在一个机器上运行,想象一下,如果同时有多台机器同时运行这个爬虫 ...
- 【Python初级】StringIO和BytesIO读写操作的小思考
from io import StringIO; f = StringIO(); f.write('Hello World'); s = f.readline(); print s; 上面这种方法“无 ...
- MySQL之varchar
MySQL之varchar 0.前言 探究关于MySQL中varchar长度的定义 1.研究MySQL的varchar列类型的背景 1.MySQL5.x 2.InnoDB 2.varchar 对于va ...
- cloudstack ssvm 管理地址不够造成无法启动修复过程
cloudstack日志记录: 上面已经提示了,管理ip没有了,造成这个原因很多,遇到过ssvm非正常关闭就有可能不释放IP慢慢把IP消耗掉.总之这肯定是BUG.按照上面的提示找到对应pod 和dc ...
- POJ 1498[二分匹配——最小顶点覆盖]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1498] 题意:给出一个大小为n*n(0<n<100)的矩阵,矩阵中放入m种颜色(标号为1 ...
- SPOJDRUIDEOI - Fata7y Ya Warda!【单调栈】
题目链接[http://www.spoj.com/problems/DRUIDEOI/en/] 题意:给出n个数,从1到n围城一个环(1和n相连),求每个数左边第一个比他大的第一个下标,右边第一个比他 ...