也谈谈规范JS代码的几个注意点
也谈谈规范JS代码的几个注意点
写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码。这种感觉就像是代码是你的作品,你希望它保持一份不仅干净而且也优雅的姿势。所以后来慢慢规范了自己写的代码,再后来觉得仅仅规范自己的代码还不行,这个团队其他人的也需要保持一致,再再后来就开始尝试写了一份代码规范,用于规范团队的代码质量。网上有不少讲代码规范的书,我也就不再献丑了,大家可以去看看阿里\百度\腾讯他们的代码规范,写的非常不错。我就仅仅把自己遇到的尝试做一下总结,这些可能别人也总结过无数次了,欢迎吐槽交流,也希望对你有点儿帮助。
1、减少全局污染
我们都知道javascript使用function来管理自己的作用域,一个定义在函数内的变量对外是不可见的,这有点类似于其它语言里的私有变量。对于javascript的执行环境来说一般都有一个全局变量,在所有的函数外可以用this来指引,例如在浏览器端是window。但是当过多的在全局执行环境下定义变量会造成各种苦逼的事情,比方说你定义的变量被其他人定义的同名变量覆盖掉,或者你未来定义的变量把你过去定义的同名变量也覆盖掉,而且过多的全局变量放在执行对战里还会造成内存的浪费等等不优化的情况发生。我就不再具体讲没个苦逼的事情是如何苦逼了,仅仅讲讲可能会导致这种情况发生的不好的示例吧。
①声明变量忘记使用“var”的情况。
var sample = function () {
var a1 = "hello";
a2 = "world";
};
sample();
alert(a1);//undefined
alert(a2);//world
如你所见,a2因为忘记使用var导致了它成为了全局的变量,这样就有可能造成其它地方的修改覆盖它或者将其它地方的变量覆盖等(忘记var也会使得该变量可以delete)。正确的做法是,所有的变量都使用“var”,并且尽量都生命在函数体的头部,这样一目了然。如下:
var sample = function () {
var a1 = true,//标识位1
a2 = true, //标识位2
a3 = false;//标识位3
//do some logic
};
(注:用“,”号隔开变量可以避免过多使用"var"。)
②变量名提升。
javascript中函数内所有使用var声明的变量都会提升到函数体头部,这也是很多人容易犯错的一点。具体来讲就是:
myname = "global";
function sample() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
sample();
如你所见,第一个alert出来的并非global。原因在于,函数sample内部声明的myname会提升到函数体顶部,而原语句的地方才是正在赋值的地方。在声明和赋值直接引用的话肯定是undefined了。其执行效果如下:
myname = "global";
function sample() {
var myname;//没有赋值
alert(myname); // "undefined"
myname = "local";//此处赋值
alert(myname); // "local"
}
sample();
所以一个重要的经验就是,在函数体讲所有的var声明的东西都拿到函数体顶部,以免造成不必要的错误。
2、for循环。
我们习惯将for循环写成如下形式:
for (var i = 0; i < myarray.length; i++) {
//logic
}
看似没有问题,但是如果myarray是读取的DOM的节点,那么每一次循环都要去DOM里选取节点再做判断,非常影响性能。可能数量不大感觉不错来,多了就非常严重了。所以,for循环判断条件里尽量不要使用涉及到DOM操作的动作。优化如下:
for (var i = 0, max = myarray.length; i < max; i++) {
// logic
}
另外一个就是使用for-in循环对象的话会读取对象从原型链里的属性,如果这不是希望的,那么可以用一个判断hasOwnProperty(i)去掉它。
3、用“===”取代“==”
前者是严格判断,后者会提前进行隐式的类型转换。
4、不使用eval()
5、统一缩进大小(无论用tab或者2个或者4个空格,团队统一即可),任何用花括号括起来并换行的都进行缩进。
6、花括号{}
for循环或者if判断等,即使只有一行,也要换行并用{}括起来。
7、空格
任何“;”后空一格、for循环中初始化“,”后空一格、数组中","后空一格、对象中“:”后空一格、如:
for (var i = 0, j = 1; i < 10; i += 1){
2 var some = [1, 2, 3];
3 var obj = {aa: 1, bb: 2}
3 }
函数参数里“,”后空一格、函数声明中花括号前空一格、函数表达式中括号前后各空一格,如:
func(a, b, c){};
function func() {};
var func = function () {};
所有的操作符前后都跟一个空格,如:
var d = 0,
a = b + 1;
if (a && b && c) {
d = a % c;
a += d;
}
8、命名规则
构造器函数首字母大写,如:
function Person() {...}
变量用驼峰式,如:
getFirstName()
常量全用大写字母,如:
var PI = 3.1415926;
私有函数用下划线开头,如:
var person = {
_setSext: function () {
// ...
},
_setName: function () {
// ...
}
};
9、写注释
这一步非常关键,因为你写的代码别人不一定看得懂,你写的将来你也不一定轻易能看懂。所以良好的注释习惯可以事半功倍。
感谢你这么大的耐性,天马行空的对着自己写的代码总结了一点儿,希望多少对你有点启发。
也谈谈规范JS代码的几个注意点的更多相关文章
- JS代码的几个注意点规范
也谈谈规范JS代码的几个注意点 也谈谈规范JS代码的几个注意点 写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码.这种感觉就像是代码是你的作品, ...
- 如何才能优雅地书写JS代码
第一:关于匿名函数的使用 要避免全局变量泛滥, 可以考虑使用匿名函数, 把不需要在外部访问的变量或者函数限制在一个比较小的范围内. 例如以下代码: <script> function fu ...
- js学习笔记-编写高效、规范的js代码-Tom
编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定 ...
- JavaScript必备:Google发布的JS代码规范(转)
[翻译]关于Google发布的JS代码规范,你需要了解什么? 翻译 | WhiteYin 译文 | https://github.com/WhiteYin/translation/issues/10 ...
- 谷歌与Airbnb的JS代码规范
谷歌JS代码规范 规范代码原因:代码规范是为了保持源代码编写模式一致,便于维护代码,可读性高. 1.使用空格代替tab 规范随后指出应该使用2个,而不是4个空格带实现缩进.(除了每一行的终止符序列,A ...
- JS代码规范
JS代码规范 空格 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格. var a = !arr.length; a++; a = b + c; 复制代码 用作代码块起始的左花括号 ...
- 前端规范之JS代码规范(ESLint + Prettier)
代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...
- Edge.js:让.NET和Node.js代码比翼齐飞
通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
随机推荐
- linux如何修改文件或目录的权限(chmod)
chmod命令是linux上用于改变权限的命令,-R 是递归遍历子目录,因为你要操作的文件使用的*通配符.777,第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其它用户 ...
- javascript复习总结
改变HTML内容:document.getElementById(id).innerHTML = new HTML; 改变HTML属性:document.getElementById(id).inne ...
- 编译安装的 mysql apache 用 service mysqld start 来启动
先我们把mysql增加到linux的系统服务中去 mysql: 代码如下 复制代码 cd /usr/local/mysql/share/mysql cp mysql.server /etc/init ...
- CodeForces 360E Levko and Game(Codeforces Round #210 (Div. 1))
题意:有一些无向边m条权值是给定的k条权值在[l,r]区间可以由你来定,一个点s1 出发一个从s2出发 问s1 出发的能不能先打到f 思路:最短路. 首先检测能不能赢 在更新的时候 如果对于一条边 ...
- 2015 "BestCoder Cup" Champion
这场比赛我没有参加,不过就算参加了也估计是被完虐.于是看着题解把大部分题目都搞了一遍. T1:Movie(hdu 5214) 题目大意: 给出N个区间,问能否选出3个互不相交的区间. N<=10 ...
- WP8.1 Study17:网络之后台下载/上传及HttpClient
一.后台下载/上传 1.简介 使用BackgroundTransferGroup可以十分方便操作上传及下载文件,BackgroundDownloader和BackgroundUploader类中的方法 ...
- Rhel6-mpich2 hpc集群配置文档
系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.121 server21.example.com 192.168.12 ...
- Hadoop 2.2.0 4结点集群安装 非HA
总体介绍 虚拟机4台,分布在1个物理机上,配置基于hadoop的集群中包括4个节点: 1个 Master, 3个 Salve,i p分布为: 10.10.96.33 hadoop1 (Master) ...
- jquery 调用ajax返回json
ie调用可以,火狐和chrome皆失败,找了半天原因. 被屏蔽了. 火狐和chrome 对同一个域名不同端口的调用也严格限制,不给调用.只能用jsonp. 查看网络的返回状态,错误信息,F12 很重要 ...
- 安装生物信息学软件-Samtools
装完Bowtie2,官方文档给出的栗子说可以玩一玩samtools,所以我入个坑 参考这篇http://m.010lm.com/roll/2016/0620/2343389.html Step 1: ...