JavaScript代码规范和性能整理
- 性能
Js在性能方面有多要注意的地方:
- 避免全局查找
Js性能优化最重要的就是注意全局查找,因为作用域的查找是先找局部作用域在没有找到之后在去上一级作用域查找直到全局作用域,所以全局作用域查找的性能消耗肯定要比本函数局部作用域的消耗大。举个例子:
function setInnerHtml(){ var divDom=doucument.getElementsByTagName(“div”); for(var i=0,len=divDom.lemgth;i<len;i++){ divDom.innerHTML=doucument.getElementByid(“dom”).innerHtml+I; } }
这段代码循环调用了doucument.getElementByid(“dom”),而在循环外只执行了一次doucument所以没必要将doucument赋值局部变量,而是把循环里面的赋值为局部变量,每次循环就不用再去查找全局的doucument对象。
function setInnerHtml(){ var domhtml= doucument.getElementByid(“dom”).innerHtml; var divDom=doucument.getElementsByTagName(“div”); for(var i=0,len=divDom.lemgth;i<len;i++){ divDom.innerHTML= domhtml +I; } }
原则就是当要多次调用全局对象的时候特别在循环中,最后将全局对象赋值到局部变量中,当然这种在几十次的调用上性能差异不会很明显,但作为一个程序员既然有性能优化的写法还是尽量去做。
- 避免with语句
现在基本不会用到这个语句了,就不多说。
- 避免不必要的属性查找
简单说就是变量存值,调用这个变量的性能消耗是最小的,而对象的属性的取值的性能消耗相对多一些。比如:
var query=window.location.href.subtring(window.location.href.indexOf(“?”));
这段代码有6次属性查找效率特别不好,最好改为:
var url=window.loaction.href; var query=url.substring(url.indexOf(“?”));
这样优化就效率提高了很多。
- 优化循环
1) 减值迭代:大多数循环都是从0开始增加循环,在很多情况下从最大值减值循环效率更高。
2) 简化终止条件:由于每次循环都会去判断终止条件,所以简化终止条件也可以提高循环效率。
3) 简化循环体:循环体是执行最多的,所以要保证循环体的优化。
- 避免解析js代码字符串
在js代码中解析js代码字符串时必须重新启动一个解析器来解析代码,这样造成比较大的性能消耗,所以尽量避免比如eval函数,function构造js代码字
符串函数,setTimeout传字符串的情况。
- 原生方法较快,尽量用原生方法。
- Switch语句较快。
- 位运算符较快。
2. 代码规范
- 代码注释:
1) 函数和方法:在每个函数或方法都应该包含注释说明函数的功能,输入输出。
2) 复杂的算法:在复杂的算法中要加入注释,好让人理解算法的逻辑思路。
3) Hack:兼容性代码上也要加入注释说明。
4) 大段代码:用于完成单个任务的多行代码应该在前面放一个描述任务的注释
- 解耦HTML/JavaScript
Html是结构成,js是行为层,他们天生需要交互,我们在写代码的时候应该尽量让html和js的关联度减小,有些方法会让他们的过于紧密的耦合,比如:js在html页面中script标签中声明js代码、在html标签中绑定onclick事件、在js改写html代码都会造成html和js过于紧密的耦合。
Html呈现应该尽可能和js保持分离,当js用于插入数据时,尽量不要直接插入标记,一般可以在页面中直接包含并隐藏标记,然后等到整个页面渲染好之后,就可以用js显示该标记。
将html和js解耦可以在调试过程中节省时间,更加容易确定错误的来源,也减轻维护难度。
- 解耦css/JavaScript
JavaScript和css也是非常紧密相关的,js经常对页面的样式做动态修改。为了让他们的耦合更松散,可以通过js修改对应的class样式类。
- 解耦应用逻辑/事件处理程序
在实际开发中我们经常在一个事件函数出来将要处理的所有代码都放在这个事件中,例如:
function handleKeyPress(event){ event=EventUtil.getTarget(event); if(event.keyCode===13){ var target=EventUtil.getTarget(event); var value=5*parseInt(target.value); if(value>10){ document.getElementById(“error-msg”).style.display=”block”; } } }
这里就是把逻辑处理代码和事件处理代码放到一起,这样会让调试不好调试,维护难度变高,而且要是突然修改要新增加一个事件做同样类似的逻辑处理,那就要复制一份逻辑处理代码到另一个事件函数中。较好的方法是将应用逻辑和事件处理程序分离开。例如:
function validateValue(value){ value=5*parseInt(value); if(value>10){ document.getElementById(“error-msg”).style.display=”block”; } } function handleKeyPress(event){ event=EventUtil.getEvent(event); if(event.keyCode===13){ var target=EventUtil.getTarget(event); validateValue(target.value); } }
这样事件处理和逻辑处理就分离开了,这样做有几个好处,可以让你更容易更改触发特定过程的事件,其次可以在不附加到事件的情况下测试代码,使其更易创建单元测试或是自动化应用流程。
事件和应用逻辑之间的松散耦合的几条原则:
- 勿将event对象传给其他方法;只传来着event对象中所需要的数据;
- 任何可以在应用层面的动作都应该可以在不执行任何时间处理程序的情况下能正常运行。
- 任何时间处理程序都应该处理事件,然后将处理转交给应用逻辑。
- 避免全局变量
这样会让脚本执行一致和可维护,最多创建一个全局变量。类似jQuery一样,所以方法属性都在$对象当中,避免对全局变量造成过多的污染。
- 尽量使用常量
数据和使用它的逻辑进行分离要注意一下几点:
- 重复值
- 用户界面字符串
- url
- 任意可能会更改的值
- 其他优化
- 多变量声明时用一条语句逗号隔开声明
- 对dom的操作的优化
- 对dom进行html代码插入尽量在最后一次添加到dom对象中。
- innerHTML的效率要比appendChild的效率高,以为innerHTML会创建一个HTML解析器,然后使用内部的DOM调用来创建DOM结构,而非基于JavaScript的DOM调用,由于内部方法是编译好的而非解释执行,所以执行快的多。
- 使用事件委托减少绑定的事件数量。
- 尽量少用到返回HTMLCollection语句。
JavaScript代码规范和性能整理的更多相关文章
- JavaScript 代码规范
所有的 JavaScript 项目适用同一种规范. JavaScript 代码规范 代码规范通常包括以下几个方面: 变量和函数的命名规则 空格,缩进,注释的使用规则. 其他常用规范-- 规范的代码可以 ...
- 5 JSON&与JavaScript转换&JavaScript:void(0)&JavaScript代码规范
JSON:JavaScript Object Notation JS对象简谱 一种轻量级的数据交换格式,用于存储和传输数据的格式,通常用于服务端向网页传递数据 是独立的语言,易于理解 JSON语法 ...
- js基石之---易读、易复用、易重构的 JavaScript 代码规范
易读.易复用.易重构的 JavaScript 代码规范 1.变量命名规范有意义 Bad: const yyyymmdstr = moment().format("YYYY/MM/DD&quo ...
- javascript代码规范 [转]
原文:http://www.css88.com/archives/5366 全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Ex ...
- 最流行的JavaScript代码规范
什么是最佳的JavaScript代码编程规范?这可能是一个众口难调的问题.那么,不妨换个问题,什么代码规范最流行? sideeffect.kr通过分析GitHub上托管的开源代码,得出了一些有趣的结果 ...
- Airbnb JavaScript代码规范(完整)
类型Types 基本数据类型 string number boolean null undefined symbol const foo = 1; let bar = foo; bar = 9; co ...
- JavaScript代码规范
变量名:驼峰命名法(首单词小写,后面每个单词首字母大写) firstName = "John"; lastName = "Doe"; price = 19.90 ...
- Airbnb Javascript 代码规范重要点总结es6
中文原地址 1.对所有的引用使用 const 而非 var.这能确保你无法对引用重复赋值. 当需要变动引用时,使用let. const和let都是块级作用域. 2.创建对象的方式: const ite ...
- javascript,jquery代码规范
jquery代码规范 Coding Standards & Best Practices 中文翻译版:jquery编程的标准写法和最佳实践 javascript代码规范 JavaScript编 ...
随机推荐
- 浅谈ServletContext
ServletContext是什么? WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用.ServletConfig对象中维护了Serv ...
- mysql数据库锁定机制
前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就 成为了各种数据库的核心技术之一.本章将对MySQL中两 ...
- --@angularJS--angular与BootStrap3的应用
angularJS与BootStrap3是最佳搭档. 1.Form.html: <!doctype html><html ng-app="UserInfoModule&qu ...
- leetcode难度及面试频率
转载自:LeetCode Question Difficulty Distribution 1 Two Sum 2 5 array sort set ...
- C# 从字符串向 datetime 转换时失败
更改电脑的日期类型即可,把短日期和长日期修改下面的样子即可:
- 删除坐标相同文本对象 按照原y坐标排序
;; ;;程序名称:对象水平对齐程序,并且按照竖直方向排列 ;;执行命令:tb2 ;;程序功能:将选定的对象左对齐,并且按照竖直方向排列. ;; (defun c:tb2(/ selobjs oldc ...
- spring mvc 必须传某个参数的写法
在controller中写 @RequestMapping(中的params="json") @RequestMapping(value = "/{username}&q ...
- 分析NGINX 健康检查和负载均衡机制
nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖于具体实现,各个实现定义不一样),不再往这个 ...
- 负载均衡软件LVS分析三(配置)
LVS集群有DR.TUN.NAT三种配置模式,可以对www服务.FTP服务.MAIL服务等做负载均衡,下面通过搭建www服务的负载均衡实例,讲述基于DR模式的LVS集群配置. 一. Director ...
- Canvas createRadialGradient API
Canvas createRadialGradient API <!DOCTYPE html> <html lang="en"> <head> ...