javascript专精--最佳实践

Web前端领域,什么样的实践,才是好的处理方式?在《JavaScript高级程序设计》一书中,从三个不同的方面来描述最佳实践:

1、可维护性
什么是可维护性的代码?那么它可能需要做到:

可理解性——其他人可接手代码并理解其意图
直观性——代码中的东西一看就能明白,不管其操作过程多么复杂
可适应性——代码一种数据上的变化不要求重写的方法
可扩展性——代码在架构上考虑未来对核心功能的扩展
可调式性——当有地方出错时,代码给予足够的提示信息来确定问题所在
代码约定
<1>、可读性

让自己的代码保证良好的缩进是有必要的

给自己的代码写注释是有必要的

<2>、变量和函数命名

命名是提高代码可读性的非常重要的一环

命名包括变量名、函数名、class名等等。

变量名应该是名词,函数名应该是动词开始。

函数也可分为逻辑功能以及事件。 

<3>、变量类型透明

每申明一个变量,应该给这个变量一个初始值。
var str = '';//代表string类型
var num = 0;//代表number类型
var bool = false;//代表boolean类型

松散耦合
<1>、解耦 HTML/JavaScript

一般而言,JavaScript的强大能力,使得它能够操作DOM,比如它能够随意的创建DOM元素、随意的添加DOM元素到document中。但是这样的代码不仅性能上存在问题,而且可读性非常差!!!

我们要有的一个思想就是,HTML用来表示界面的内容,而JavaScript只用来定义行为。

<2>、解耦 CSS/JavaScript

JavaScript同样能用来操作CSS,可是千万不要这样做!!除非你是要写运行函数。

<3>、解耦应用逻辑和事件处理程序

操作dom,我们使用的是事件函数

作为Js,有另外一部分功能是和DOM操作不相关的逻辑,应该单独隔离出来,封装成函数。

编程实践
<1>、尊重对象所有权

尽量的不要改变原生对象的方法,如toString()、push()、sort()等等,改变或者重写的后果,就是合作开发的时候,别人不知道这个方法已经改变,可能就会出错。

一定不要修改别人的对象,如果这个对象不是你创建并且维护的,那么你就只有使用的权利。

<2>、避免全局量

这个很好理解,全局变量的过多使用,很可能在合作开发的时候造成冲突。如果需要使用,那就用尽可能使用较少的全局变量。

//使用一个obj可以表示三个变量的功能。
var obj = {
    a,
    b,
    c,
}

<3>、使用常量

你定义一个东西,一定要想,这个东西到底后面会不是被改变,如果不会被改变的话,那就尽量的把它定义成常量,作为一个公共的东西提取出来。

2、保证代码性能
保证自己的代码性能,是每个web开发人员的基本素养,虽然这方面的东西可量化的地方不多,但还是有一些比较好的编程模式值得去借鉴:

注意作用域
<1>、避免全局查找

使用全局变量的函数,一定要比使用局部变量的函数的开销更大,因为要涉及到作用域链上的查找。

function updateUI(){
    var imgs = document.getElementsByTagName("img");
    var obox = document.getElementById("box");
}

这样的函数,调用了两次document,也就是自己在作用域链上查找了两次。

function updateUI(){
    var doc = document;//这里只调用一次document。
    var imgs = doc.getElementsByTagName("img");
    var obox = doc.getElementById("box");
}

避免多次的全局作用域查找,在编程实践中,是很有必要的。

<2>、避免使用with语句 
with语句的使用,会有额外的作用域链的开销。

选择正确方法
<1>、避免不必要的属性查找 
多层的属性查找的代价会很大,比如这个的示例:

var query = window.location.href.substring(window.location.href.indexof("?"));
两次使用window.location.href,这样还不如这么写:

var url = window.location.href;
var query = url.substring(url.indexof("?"));

这样的方式,性能明显更高。

<2>、优化循环

大多数循环是从0开始,但是很多情况下,从最大值开始,进行减值迭代的效果明显更高。

var list = document.getElementsByTagName('li');
for(var i = 0; i < list.length; i++){
    //code
}

上面的for循环每次都要重新计算list的长度,这就存在性能问题,所以在for循环中,我们有一种说法是——优化终止条件。 
下面的写法可能会好一点:

var list = document.getElementsByTagName('li');
for(var i = 0,len = list.length; i < len; i++){
    //code
}

有时候,一些循环是没有必要的,我们增加一些if判断,可能要减少很多无用操作。

<3>、避免双重解释 
JavaScript代码想解析JavaScript的时候会存在双重解释惩罚。

当使用eval()、Function()构造函数、setTimeout()的时候,传入一个字符串,都会发生这种情况。

原因就是JavaScript解析这些字符串是需要重新开启一个解析器来解析新的代码。(这是不容忽视的开销)。

eval("alert('hello world!')");//一定要避免

最小化语句数
var i = 0,j,k;
var i = 0;
var j;
var k;

这两个申明变量的方式相比,第一是一个申明变量的语句,第二个是三个申明变量的语句。

优化DOM交互
<1>、最小化现场更新 
大量的dom操作是造成页面性能的最大帮凶,比如多次向页面添加元素。特别是在for循环中!!! 
使用文档片段来构建DOM结构,可能是一个好方法。

var fragment = document.createDocumentFragment();
for(var i = 0; i < 10; i++){
    item = document.createElement('li');
    fragment.appendChild(item);
    item.appendChild(document.createTextNode('Item'+i));
}
list.appendChild(fragment);

<2>、使用innerHTML

把innerHTML设置为某个值的时候,后台会自动创建一个HTML解析器,然后使用内部的DOM调用来创建DOM结构。

<3>、使用事件代理 
一个ul列表,给添加一个点击事件,尽量别for循环添加。使用事件代理的方式,添加到ul上性能会好很多。

原文:https://blog.csdn.net/mapbar_front/article/details/78635412 
 

猜你喜欢

转载自blog.csdn.net/wenmin1987/article/details/83513976