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编 ...
随机推荐
- 【Xilinx-VDMA模块学习】-01- VDMA IP的GUI配置介绍
使用的是Vivado 2015.4,XC7Z020, AXI Video Direct Memory Acess(6.2). 在我的系统中,GUI配置图片如下:(其实和默认配置没有太大区别) 下面介绍 ...
- spark Intellij IDEA开发环境搭建
(1)创建Scala项目 File->new->Project,如下图 选择Scala 然后next 其中Project SDK指定安装的JDK,Scala SDK指定安装的Scala(这 ...
- php 特别的函数
call_user_func函数和call_user_func_array函数 set_include_path
- 利用DIV+CSS制作网页过程中常用的基本概念及标签使用细节
CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...
- poj 1013(uva 608) Counterfeit Dollar
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #in ...
- datatable 使用详细说明
要注意的是,要被dataTable处理的table对象,必须有thead与tbody,而且,结构要规整(数据不一定要完整),这样才能正确处理.以下是在进行dataTable绑定处理时候可以附加的参数: ...
- ListView 的三种数据绑定方式
ListView 的三种数据绑定方式 1.最原始的绑定方式: public ObservableCollection<object> ObservableObj; public Mai ...
- 使用 GitHub, Jekyll 打造自己的免费独立博客
使用 GitHub, Jekyll 打造自己的免费独立博客 GitHub是一个代码托管网站,现在很多开源项目都放在GitHub上. 利用GitHub,可以让全球各地的程序员们一起协作开发.GitHub ...
- C++中定义使用受限的类
1.只能在堆上使用的类 栈上对象通过自动调用析构函数释放空间,将该类的析构函数定义为private就可以阻止其被自动调用,从而阻止在栈上使用该类的对象,为了避免资源泄漏问题,在堆上使用该类的对象时我们 ...
- Spring @Aspect进行类的接口扩展
Spring @Aspect进行类的接口扩展: XML: <?xml version="1.0" encoding="UTF-8"?> <be ...