养成良好的编码习惯,提高代码的可维护性

  • 避免定义全局变量或函数

定义全局的变量和函数,会影响代码的可维护性。如果在页面中运行的javascript 代码是在相同的作用域里面,那就可能代码之间存在互相影响的可能性。

有很多种手段可以解决因为定义了全局变量而导致代码"污染"的问题。

1.最简单的方法是把变量和方法封装在一个变量对象上,使其变成对象的属性。例如:

var myTes={

length:0'

init:function(){...},

action:function(){...}

}

2.另一种改进的方案是把全局的变量包含在一个局部作用域中,然后在这个作用域中完成这些变量的定义以及变量使用的逻辑。例如,可以通过定义一个匿名函数实现:

(function()

{

var length=0;

function init(){...}

function action(){...}

})()

所有的逻辑都包含在了这个立即执行的匿名函数中,形成了一个独立的模块,最大限度的防止了代码之间的"污染"。当然,在实际的业务中,模块之间会有交互,这时可使用return语句,返回需要公开的接口。

var myDocument=(function()

{

var length=0;

function init(){...}

function action(){...}

return {

init:init

}

})();

外部代码访问init()方法时,就可以调用myDocument.init了。此代码巧妙地做到了代码逻辑的封装,又公开了外部需要访问的接口,是模块化最佳实践之一。

3.确保在定义变量时使用var关键字。如果定义变量时没有使用var,浏览器解析时并不会报错,而是自动把这一变量解析为全局变量,比如如下的代码就定义了一个全局的变量length:

(function()

{

length=0;

function init(){...}

function action(){...}

}

)()

  • 使用简化的编码方式

//对象创建

var persion=new Object();

person.age=23;

person.name='daniel';

改为:

var person={age:23,name:'daniel'};

//数组创建

var list=new Array();

list[0]=12,

list[1]=20;

list[2]=24;

改为:

var list=[12,20,24];

  • 使用比较运算符=== 而不是 ==

  • 避免使用with语句

在javascript中,with语句可用来快捷地访问对象地属性。with语句地格式如下:

with(object)

{

.......

}

with语句地原理是:javascirpt解析和运行时,会给with语句单独建立一个作用域,而和with语句结合的属性则成为了此作用域的局部变量,因此可直接访问。例如:

with(Math)

{

a=PI*r*r;

}

以下代码等同于以上代码

a=Math.PI*r*r;

使用with语句确实简化了代码,但使用with语句可能也会带了一些bug已经兼容问题

  1. 使得代码难以阅读,对于with语句内部的变量引用,只有在运行时才能知道变量属于哪个对象。例如:

function f(x,o)

{

with(o)

{

print(x);

}

}

以上with语句中的x,可能来自于参数x,也可能来自o参数上的x属性。

2.with语句的设计方面也有缺陷,在with语句内部修改和with语句结合的对象后,并不能同步到with内部,即不能保证对象数据的一致性。例如:

var group ={

value:{

     node:1

}

};

with(group.value)

   {

     group.value={

      node:2

      };

     //显示错误:1

     console.log(node);

   }

//显示正确:2

console.log(group.value.node);

  • 避免使用eval

  1. 有时使用eval函数会让代码难以阅读,影响代码的可维护性。如:

如果通过变量来获取某个对象的属性值,可以使用eval('obj.'+key);

其实可以使用下标法取得属性值:obj[key]

2.    eval的使用也存在安全性问题,因为它会执行任意传入的代码,而传入的代码有可能是未知的或者来自不受控制的源。

.使用更严格的编码格式

设立严格模式的目的主要是为了消除javascript语法上不合理的地方,从而提高代码安全性、编译效率、增加运行速度且更好地兼容javacscript未来的新版本。

严格模式主要是针对如下不合理的地方做了改进,包括:禁用with关键字、防止意外的全局变量、函数中的this 不再默认指向全局、防止函数参数重名、防止对象 属性重名、更安全的使用eval等。

启用严格模式很简单,主要在代码中添加如下代码即可:

"use strict";

使用严格模式时需要遵循的几条最佳实践。

  1. 不要在全局中启用严格模式

为了兼容一些老代码,最好不要全局启用严格模式,如果想给大量的代码设置严格模式,则可以把代码包含在一个立即执行的函数中,并在函数开头启用严格模式,示例代码如下:

(function(){

"use strict"

// ..........

})();

2. 如果要更严格地编写javascript代码,可以使用javascript代码检查工具。目前最流行的检查工具主要是JSLint和JSHint。

高维护性的javascript的更多相关文章

  1. C++ //多态案例 -计算器类(普通写法 和 多态写法) //利用多态实现计算器 //多态好处: //1.组织结构清晰 //2.可读性强 //3.对于前期和后期扩展以及维护性高

    1 //多态案例 -计算器类(普通写法 和 多态写法) 2 3 #include <iostream> 4 #include <string> 5 using namespac ...

  2. 如何编写可维护的面向对象JavaScript代码

    能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...

  3. 推荐 greenrobot eventbus,简化安卓开发,提高安卓维护性,优化安卓性能

    最近在研究移动开发,广泛的阅读有关cordova,apicloud,android资料.发现安卓的开发还是很简单的.再发现greenrobot eventbus开源框架不仅可以简化安卓开发,有可以大幅 ...

  4. 探索 ConcurrentHashMap 高并发性的实现机制--转

    ConcurrentHashMap 是 Java concurrent 包的重要成员.本文将结合 Java 内存模型,来分析 ConcurrentHashMap 的 JDK 源代码.通过本文,读者将了 ...

  5. 【转】探索 ConcurrentHashMap 高并发性的实现机制

    原文链接:https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/  <探索 ConcurrentHashMap ...

  6. 使用typescript开发js代码提升代码维护性

    function test() { var gs = new Greeter('ss'); alert( gs.greet()); } window.onload = test; class Gree ...

  7. 异步函数封装请确保异步性(Javascript需要养成的良好习惯)

    背景假设: 你有许多的配置信息存放在服务器上,因为配置太多,不希望每次都把所有的配置信息都写到前端,希望能需要用的时候再获取就好了. 因为Javascript单线程运行,你不希望堵塞ui渲染于是你专门 ...

  8. 高健壮性css---Float详细

    (一)关于float 首先我们了解到,CSS网页布局的原理,就是按照HTML代码中对象声明的顺序,以流布局的方式来显示它,而流布局就不得不说到float浮动技术..在HTML中的所有对象,默认分为两种 ...

  9. 《编写高质量代码改善JavaScript程序的188个建议》读书笔记

    逗号运算符比较怪异.如    var a =(1,2,3,4);alert(a);// 4      var a = 1,2,3,4;//报错 注意a++和++a的差别,变量在参与运算中不断地变化.v ...

随机推荐

  1. PostgreSQL 优化器代码概览

    简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...

  2. tyvj 1266 费解的开关

    传送门 解题思路 枚举第一行的状态,判断后面可不可行. 代码 #include<iostream> #include<cstdio> #include<cstring&g ...

  3. 19-10-25-G-悲伤

    此题未通过 [ 老帅哥 ] 认证. ZJ一下: T1,明显是二分答案+$dij/SPFA$ T2,没看懂题. T3,打了一个$\Theta(N^2)$暴力. 事实上…… T1,T2死了. T1中 每次 ...

  4. 【DM642学习笔记四】flash烧写过程——错误记录…

    (欢迎批评指正) 一,打开.cdd配置文件时出错: 解决:在FlashBurn配置窗口中,Conversion Cmd一栏可不用管:      菜单Program—Download FBTC,load ...

  5. 2019-4-17-从-dotnet-core-3.0-的特性让-WPF-布局失效讨论-API-兼容

    title author date CreateTime categories 从 dotnet core 3.0 的特性让 WPF 布局失效讨论 API 兼容 lindexi 2019-4-17 1 ...

  6. LA3516 Exploring Pyramids

    Exploring Pyramids 题目大意:给定一个欧拉序列(即每经过一个点,把这个点加入序列),问有多少种对应的多叉树 序列与树构造对应问题,考虑区间DP dp[i][j]表示序列i...j对应 ...

  7. LUOGU P1680 奇怪的分组

    题目背景 终于解出了dm同学的难题,dm同学同意帮v神联络.可dm同学有个习惯,就是联络同学的时候喜欢分组联络,而且分组的方式也很特别,要求第i组的的人数必须大于他指定的个数ci.在dm同学联络的时候 ...

  8. TZ_05_Spring_转账事务基于xml的开发

    事务:通过接口的动态代理加强AccountService 实现转账的事务 ApplicationContext.xml <?xml version="1.0" encodin ...

  9. 组件化开发之vue

    今天写了写vue的组件化开发demo,有些小的心得.分享一下. 组件化意味着代码可以复用,调用组件就可以了.然后可以通过组件调用组件的相关能力. 例如以前我做组件化开发的一个小项目 原生js组件的实现 ...

  10. NYoj536 矩阵链乘

    经典问题没啥说的 #include<stdio.h> #include<string.h> #define max 100+1 #define min(a,b) (a<b ...