JS代码的几个注意点规范
也谈谈规范JS代码的几个注意点
也谈谈规范JS代码的几个注意点
写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码。这种感觉就像是代码是你的作品,你希望它保持一份不仅干净而且也优雅的姿势。所以后来慢慢规范了自己写的代码,再后来觉得仅仅规范自己的代码还不行,这个团队其他人的也需要保持一致,再再后来就开始尝试写了一份代码规范,用于规范团队的代码质量。网上有不少讲代码规范的书,我也就不再献丑了,大家可以去看看阿里\百度\腾讯他们的代码规范,写的非常不错。我就仅仅把自己遇到的尝试做一下总结,这些可能别人也总结过无数次了,欢迎吐槽交流,也希望对你有点儿帮助。
1、减少全局污染
我们都知道javascript使用function来管理自己的作用域,一个定义在函数内的变量对外是不可见的,这有点类似于其它语言里的私有变量。对于javascript的执行环境来说一般都有一个全局变量,在所有的函数外可以用this来指引,例如在浏览器端是window。但是当过多的在全局执行环境下定义变量会造成各种苦逼的事情,比方说你定义的变量被其他人定义的同名变量覆盖掉,或者你未来定义的变量把你过去定义的同名变量也覆盖掉,而且过多的全局变量放在执行对战里还会造成内存的浪费等等不优化的情况发生。我就不再具体讲没个苦逼的事情是如何苦逼了,仅仅讲讲可能会导致这种情况发生的不好的示例吧。
①声明变量忘记使用“var”的情况。

1 var sample = function () {
2 var a1 = "hello";
3 a2 = "world";
4 };
5 sample();
6 alert(a1);//undefined
7 alert(a2);//world

如你所见,a2因为忘记使用var导致了它成为了全局的变量,这样就有可能造成其它地方的修改覆盖它或者将其它地方的变量覆盖等(忘记var也会使得该变量可以delete)。正确的做法是,所有的变量都使用“var”,并且尽量都生命在函数体的头部,这样一目了然。如下:
1 var sample = function () {
2 var a1 = true,//标识位1
3 a2 = true, //标识位2
4 a3 = false;//标识位3
5 6 //do some logic
7 8 };
(注:用“,”号隔开变量可以避免过多使用"var"。)
②变量名提升。
javascript中函数内所有使用var声明的变量都会提升到函数体头部,这也是很多人容易犯错的一点。具体来讲就是:

1 myname = "global";
2 function sample() {
3 alert(myname); // "undefined"
4 var myname = "local";
5 alert(myname); // "local"
6 }
7 sample();

如你所见,第一个alert出来的并非global。原因在于,函数sample内部声明的myname会提升到函数体顶部,而原语句的地方才是正在赋值的地方。在声明和赋值直接引用的话肯定是undefined了。其执行效果如下:

1 myname = "global";
2 function sample() {
3 var myname;//没有赋值
4 alert(myname); // "undefined"
5 myname = "local";//此处赋值
6 alert(myname); // "local"
7 }
8 sample();

所以一个重要的经验就是,在函数体讲所有的var声明的东西都拿到函数体顶部,以免造成不必要的错误。
2、for循环。
我们习惯将for循环写成如下形式:
1 for (var i = 0; i < myarray.length; i++) {
2 //logic
3 }
看似没有问题,但是如果myarray是读取的DOM的节点,那么每一次循环都要去DOM里选取节点再做判断,非常影响性能。可能数量不大感觉不错来,多了就非常严重了。所以,for循环判断条件里尽量不要使用涉及到DOM操作的动作。优化如下:
1 for (var i = 0, max = myarray.length; i < max; i++) {
2 // logic
3 }
另外一个就是使用for-in循环对象的话会读取对象从原型链里的属性,如果这不是希望的,那么可以用一个判断hasOwnProperty(i)去掉它。
3、用“===”取代“==”
前者是严格判断,后者会提前进行隐式的类型转换。
4、不使用eval()
5、统一缩进大小(无论用tab或者2个或者4个空格,团队统一即可),任何用花括号括起来并换行的都进行缩进。
6、花括号{}
for循环或者if判断等,即使只有一行,也要换行并用{}括起来。
7、空格
任何“;”后空一格、for循环中初始化“,”后空一格、数组中","后空一格、对象中“:”后空一格、如:
1 for (var i = 0, j = 1; i < 10; i += 1){
2 var some = [1, 2, 3];
3 var obj = {aa: 1, bb: 2}
3 }
函数参数里“,”后空一格、函数声明中花括号前空一格、函数表达式中括号前后各空一格,如:
1 func(a, b, c){};
2 function func() {};
3 var func = function () {};
所有的操作符前后都跟一个空格,如:
1 var d = 0,
2 a = b + 1;
3 if (a && b && c) {
4 d = a % c;
5 a += d;
6 }
8、命名规则
构造器函数首字母大写,如:
1 function Person() {...}
变量用驼峰式,如:
1 getFirstName()
常量全用大写字母,如:
1 var PI = 3.1415926;
私有函数用下划线开头,如:

1 var person = {
2 _setSext: function () {
3 // ...
4 },
5 _setName: function () {
6 // ...
7 }
8 };

9、写注释
这一步非常关键,因为你写的代码别人不一定看得懂,你写的将来你也不一定轻易能看懂。所以良好的注释习惯可以事半功倍。
感谢你这么大的耐性,天马行空的对着自己写的代码总结了一点儿,希望多少对你有点启发。
JS代码的几个注意点规范的更多相关文章
- 也谈谈规范JS代码的几个注意点
也谈谈规范JS代码的几个注意点 写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码.这种感觉就像是代码是你的作品,你希望它保持一份不仅干净而且也优 ...
- 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 ...
- 在Java中直接调用js代码(转载)
http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...
随机推荐
- table插入标签form标记怪现象
最近帮朋友处理问题,它无法提交表单,得到一些时间,我发现了一个奇怪的问题 <table> <form action="upload.php" method=&qu ...
- c# winform panel 流式布局 panel块可自动排列
代码下载地址 http://download.csdn.net/detail/simadi/7677053
- 在SSMS里查看TDS数据包内容
原文:在SSMS里查看TDS数据包内容 在SSMS里查看TDS数据包内容 摘抄自<SQLSERVER2012实施与管理实战指南> 要具体查看TDS数据库的内容,我们可以: 用NETWORK ...
- javascript倒置再次被否定作用
于javascript位反然后可以转换为浮点塑料,而不是更有效parseInt近两倍 var start = new Date().getTime(); for (var i = 0; i < ...
- iOS 自己主动布局教程
springs和struts的问题 你肯定非常熟悉autosizing masks-也被觉得是springs&struts模式.autosizing mask决定了当一个视图的父视图大小改变时 ...
- 如何从Terminal Command Line编译并运行Scope
Ubuntu SDK我们大部分的开发者是非常有效的.它甚至可以帮助我们进行在线调试.在这篇文章中,我们介绍了如何使用command line编译和执行我们scope. 1)创建一个主Scope 我们能 ...
- 具体的例子来教你怎么做LoadRunner结果分析
LoadRunner 解的地方--測试结果的分析.其余的录制和加压測试等设置对于我们来讲通过几次操作就能够轻松掌握了.针对 Results Analysis 我用图片加文字做了一个样例,希望通过样例能 ...
- Codeforces 459E Pashmak and Graph(dp+贪婪)
题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边依 ...
- compass安装使用960 Grid System
960 Grid System 是一个CSS的页面布局框架 demo: http://960.gs/demo.html 前提:安装Ruby .NodeJS 步骤1:在命令行下安装css插件: gem ...
- Ping azure
最近azure在虚拟机上打开(欧式世纪互联),这其实并不能ping虚拟机! 查了一下资料,发现azure不支持被ping这个功能(貌似是不开放ICMP-in这个协议).有些用户跟客服问过这个问题,可是 ...