也谈谈规范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代码的几个注意点的更多相关文章

  1. JS代码的几个注意点规范

    也谈谈规范JS代码的几个注意点 也谈谈规范JS代码的几个注意点 写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码.这种感觉就像是代码是你的作品, ...

  2. 如何才能优雅地书写JS代码

    第一:关于匿名函数的使用 要避免全局变量泛滥, 可以考虑使用匿名函数, 把不需要在外部访问的变量或者函数限制在一个比较小的范围内. 例如以下代码: <script> function fu ...

  3. js学习笔记-编写高效、规范的js代码-Tom

    编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定 ...

  4. JavaScript必备:Google发布的JS代码规范(转)

    [翻译]关于Google发布的JS代码规范,你需要了解什么? 翻译 | WhiteYin 译文 | https://github.com/WhiteYin/translation/issues/10 ...

  5. 谷歌与Airbnb的JS代码规范

    谷歌JS代码规范 规范代码原因:代码规范是为了保持源代码编写模式一致,便于维护代码,可读性高. 1.使用空格代替tab 规范随后指出应该使用2个,而不是4个空格带实现缩进.(除了每一行的终止符序列,A ...

  6. JS代码规范

    JS代码规范 空格 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格. var a = !arr.length; a++; a = b + c; 复制代码 用作代码块起始的左花括号 ...

  7. 前端规范之JS代码规范(ESLint + Prettier)

    代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...

  8. Edge.js:让.NET和Node.js代码比翼齐飞

    通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...

  9. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

随机推荐

  1. 安卓手机上运行 PC-E500 程序

    目录 第1章安卓手机上运行 PC-E500 程序    1 1 PockEmul    1 2 下载    1 3 打包BASIC程序    2 4 配置PC-E500模拟器    5 5 载入e50 ...

  2. 【xsy1019】小A的树论

    题意 三种操作: ①区间增值 ②某一个点换父亲 ③求子树和 \(1\leq n\leq 100000\) 分析 Splay维护dfn序. 小结 (1)使用Splay,通常要在Splay的两端各添加一个 ...

  3. jquery动画基础

    根据id改变字体大小的动画 <div class="speech">样式切换</div> <div id="switcher"&g ...

  4. dos2unix,去掉Linux下文件中的^M

    Windows系统下使用VS2010编写好的CPP文件,想放到Linux上进行编译.发现Linux上文件中的每行代码末尾都跟着^M这个符号. 为什么同一份文件在windows上和Linux上显示的不一 ...

  5. 使用Settings.settings存储用户的个性化配置

    1.在vs中设计要存储的字段,如:zbl,注意范围选择用户 读取: var aa = Properties.Settings.Default.zbl; 写入: Properties.Settings. ...

  6. POJ 1094 Sorting It All Out 拓扑排序 难度:0

    http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...

  7. cocos2d-x 系列文章介绍

    学习 cocos2d-x 一年多,从3.0bata 到 现在的 3.6 ,从最早没什么教程到现在官网繁多的资料教程,  cocos2d-x  的变化实在是大.刚开始学习 cocos2d-x 是到处找资 ...

  8. sourceTree 更新svn提示can't locate SVN/Core.pm

    装了sourceTree一直没有怎么用,今天试着用用,居然报错 can't locate SVN/Core.pm 详细报错如下: Can't locate SVN/Core.pm in @INC (y ...

  9. C++二进制文件中读写bitset

    这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...

  10. 例子:Background Agent Sample

    通过本例程学习: 后台代理Agent的使用方法 定期代理(PeriodicTask)来说,限制了: 有一些API不能使用,并不是说你不调用就可以了,只要你在同一个程序集里使用了这些API,就不会通过验 ...