在多年开发邮箱webmail过程中,网易邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享。今天想先和大家聊聊javascript的编码规范。

  总所周知,javascript是一种语法极其灵活的语言。javascript在设计之初就只是用来为HTML添加动态效果的。由于他动态,弱类型 等特性,以及不同浏览器的兼容性问题,造成了开发成本要比java等语言要高很多。正因为它太灵活,我们制定了适用于网易邮箱的javascript编码 规范,尽可能多的降低由于语法灵活造成的问题。以下将具体介绍:

  1. 变量命名规范

  变量名包括全局变量,局部变量,类变量,函数参数等等,他们都属于这一类。

  基本规范

  变量命名都以类型前缀+有意义的单词组成,单词首字母都需要大写。例如:sUserName,nCount。

  前缀规范

  每个局部变量都需要有一个类型前缀,按照类型可以分为:

  s:表示字符串。例如:sName,sHtml;

  n:表示数字。例如:nPage,nTotal;

  b:表示逻辑。例如:bChecked,bHasLogin;

  a:表示数组。例如:aList,aGroup;

  r:表示正则表达式。例如:rDomain,rEmail;

  f:表示函数。例如:fGetHtml,fInit;

  o:表示以上未涉及到的其他对象,例如:oButton,oDate;

  例外情况:

  1:作用域不大临时变量可以简写,比如:str,num,bol,obj,fun,arr。

  2:循环变量可以简写,比如:i,j,k等。

  为什么需要这样强制定义变量前缀?正式因为javascript是弱语言造成的。在定义大量变量的时候,我们需要很明确的知道当前变量是什么属性,如果只通过普通单词,是很难区分的。

  例如:

var group = [];    
group.name = 'myGroup';

//这时候你还能一眼就看出来group是什么吗?

  又例如:

var checked = false;    
var check = function(){    
       return true;    
}

if(check){//可能将checked写成check,由于不能很快速的发现check是函数,造成逻辑错误    
       //do some thing    
}

  如果我们写成:

var bChecked = false;    
var fCheck = function(){    
       return true;    
}

if(bChecked){    
       // do some thing    
}    
if(fCheck()){    
       // do other thing    
}

  就清楚很多了。

  全局变量以及常量规范

  网易邮箱前端是基于“类”的概念来来开发javascript的(稍后会专门介绍),每个类定义都是在一个闭包函数中,除了在window下有类的定义而外,只允许有两种变量定义在全局,那就是全局变量和常量。

  全局变量使用g作为前缀,定义在window下。例如gUserName,gLoginTime。

  某些作为不允许修改值的变量认为是常量,全部字母都大写。例如:COPYRIGHT,PI。常量可以存在于函数中,也可以存在于全局。

  看个例子就 很容易明白为什么要这样定义了:

var userName = "dongua";    
function checkName(userName){    
       //存在函数参数userName以及全局变量userName,如果要比较两个值是否相等,必需写为    
       return window.userName == userName    
}

  如果使用了全局变量的前缀,就十分清晰了。

  2. 函数命名规范

  统一使用动词或者动词[+名词]形式,例如:fGetVersion(),fSubmitForm(),fInit();涉及返回逻辑值的函数可以使用is,has等表示逻辑的词语代替动词。

  如果有内部函数,使用__f+动词[+名词]形式,内部函数必需在函数最后定义。例如:

function fGetNumber(nTotal){    
       if(nTotal<100){    
   nTotal = 100;    
     }    
  return __fAdd(nTotal);        
      
  function __fAdd(nNumber){    
   nNumber++;    
   return nNumber;    
  }    
}    
alert(fGetNumber(30));//alert 101

  对象方法实现

  对象方法命名使用 f+对象类名+动词[+名词]形式;例如 fAddressGetEmail

  事件响应函数

  某事件响应函数命名方式为触发事件对象名+事件名或者模块名+触发事件对象名+事件名,例如:fDivClick(),fAddressSubmitButtonClic k()

  3.其他注意事项

  1:所有命名最好使用英语表示。

  2:所有变量名应该明确而必要,尽量避免不必要的容易混淆的缩写。

  3:netease.events.mouse.Handler,而不是 netease.events.mouse.MouseEventHandler。

  4:对应的方法应该使用对应的动词,例如:get/set, add/remove, create/destroy, start/stop, insert/delete, begin/end。

  5:应该避免双重否定意义的变量,例如:bIsNotError, bIsNotFound,不可取。

  6:变量应该在最小的范围内定义,并尽可能的保持最少的活动时间。

  7:循环变量最好在循环中定义。例如for(var i=0,m=10;i

  8:尽量避免复杂的条件语句,可以使用临时的boolean变量代替。

  9:一定要避免在条件中执行语句,例如:if((i=3)>2){},不可取。

  10:不要在代码中重复使用相同意义的数字,用一个变量代替,比如 nTotal=100; num= total。

  网易邮箱页面在window只允许定义三种变量——1:全局变量;2:常量;3:类。任何业务逻辑都需要通过类方法或者示例方法实现。前两种变量在之前文章中已经介绍,在此不再累述,接下来详细介绍类定义和使用的规范。

  定义类是通过一个闭包完成的:

(function(){    
   //第一步:引入存在的类。引入support类    
   var Support = window.Support;      
      
   //$是网易邮箱基础库“base”的引用稍后会介绍    
   //第二步:定义类。可以认为返回了一个类定义 function(){},并在window下定义一个Image类    
   var Image = $.createClass("Image");      
      
   //可以认为是jQuery的extend方法      
      
   //第三步:定义类属性/方法定义    
   $.Object.extend(Image,{    
     _language : null,     //内部属性    
     getSize   : fImageGetSize    
   });    
   //第四步:定义实例属性/方法定义    
   $.Object.extend(Image.prototype,{    
     name   : null,    
     url     : null,    
     ext     : null,    
     width   : 0,    
     height   : 0,    
     setName   : fImageSetName,    
     getName   : fImageGetName,    
     init   : fImageInit    
   });    
   //第五步:方法实现      
      
   function fImageGetSize(nWidth,nHeight){    
     return nWidth*nHeight;    
   }      
      
   function fImageSetName(sName){    
     var oImage = this;    
     oImage.name = sName;    
   }      
      
   function fImageGetName(){    
     var oImage = this;    
     return oImage.name;    
   }      
      
   function fImageInit(sUrl){    
     var oImage = this;    
     oImage.url = sUrl;    
     oImage.ext = Support.getExt(sUrl);    
     oImage.width = Support.getWidth(sUrl);    
     oImage.height = Support.getHeight(sUrl);    
   }      
      
  })();

  我们可以看到,这个闭包完成了以下几件事情:

  1.引入这个类需要用到的其他类。

  2.定义这个类。

  3.定义类的属性和方法。

  4.定义类的实例属性和方法。

  5.类和实例方法的实现。

  在命名上,我们遵循了一下规则:

  1.类名首个字母必需大写,例如Image,Support等。

  2.属性名需要是有意义的名词,首字母小写,例如oImage.width。

  3.方法名需要是有意义的动词[+名词],首字母小写,例如Support.getWidth

  4.如果不希望被其他方法调用,需要在属性或者方法名前面加“_”,例如oImage._language

  5.如果不希望被子类调用,需要在属性或者方法名前加“_”,例如oImage.__fire()

  这里需要特别说明以下几点:

  1.方法的定义不是通过匿名函数来定义,而是集中在类定义的下面来实现。这样的好处是能在最开始将类的属性方法定义都罗列出来,便于通过源码查看到对应属性和方法。

  2.在类/实例方法中,使用局部变量代替this。this不是一个好的玩意儿,一不小心就会被this搞晕。使用局部变量能够尽量避免这样的问题,也能够在压缩混淆的时候效果更好。

  3.在实际开发过程中,每个类定义都单独一个js实现。

  除了类的定义,闭包不实现 任何其他逻辑。使用闭包能够将很多变量约束在闭包作用域中,并且能够在压缩混淆中效果更好,除此之外,使用闭包定义类,在之后将介绍到的动态加载成为了一件十分容易的事情,稍后会和大家一起分享。

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/

网易前端JavaScript编码规范相关推荐

  1. JavaScript => JavaScript编码规范指南

    JavaScript 编码规范指南 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 对于未提及的事项可以参考airbnb的JS编码规范 airbnb/j ...

  2. javascript编码规范

    一.前言 如果你写的代码只是给自己看,不需要与多人共同协作:如果你写的代码不打算开源:如果你不进行code review:如果你不打算担任前端工程师这一岗位,只是单纯业余爱好:满足以上任一条件,我建议 ...

  3. JavaScript编码规范[百度]

    JavaScript编码规范 1 前言 2 代码风格 2.1 文件 2.2 结构 2.2.1 缩进 2.2.2 空格 2.2.3 换行 2.2.4 语句 2.3 命名 2.4 注释 2.4.1 单行注 ...

  4. JavaScript 编码规范大全-Eslint(持续更新,欢迎关注点赞加评论)

    JavaScript 编码规范大全(持续更新,欢迎关注点赞加评论) 文章目录 JavaScript 编码规范大全(持续更新,欢迎关注点赞加评论) 前言 0. 相关工具 1. 类型 2. 引用 3. 对 ...

  5. 基础的JavaScript编码规范

    /** 前言* 这个文档摘自Nicbolas C Zakas(担任过雅虎首席前端工程师) 著作 <编写可维护的 JavaScript>,下面是一些摘要* 这个文档讲了一些很基本的编写Jav ...

  6. Javascript编码规范,好的代码从书写规范开始,增强代码的可读性,可维护性,这是相当重要的!...

    1. 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对JavaScript设 ...

  7. 前端:前端安全编码规范

    前言 随着互联网高速的发展,信息安全已经成为企业重点关注焦点之一,而前端又是引发安全问题的高危据点,所以,作为一个前端开发人员,需要了解前端的安全问题,以及如何去预防.修复安全漏洞. 下面就以前端可能 ...

  8. javascript 编码规范 用更合理的方式写 javascript

    目录 类型 引用 对象 数组 解构 Strings 函数 箭头函数 构造器 模块 Iterators and Generators 属性 变量 Hoisting 比较运算符和等号 代码块 注释 空白 ...

  9. 前端代码编码和设计规范系列——JavaScript编程规范

    1文档信息 条目 内容 项目编号 通用 项目名称 通用 标题 JavaScript编程规范 类别 规范文档 当前 试用草稿 摘要 当前版本 V1.0 日期 2015/11/9 作者 徐维坚(xuwei ...

最新文章

  1. 2022-2028年中国房车旅游行业深度调研及投资前景预测报告
  2. C#编程中的crc16校验
  3. 判断是否是2的N次方
  4. 斑马技术发布《2022年中国医院愿景研究》:未来5年,超过90%的临床医生将采用移动技术...
  5. Spray + Akka高性能异步IO并发
  6. 算法(13)-leetcode-explore-learn-数据结构-链表小结
  7. 路考步骤七步走 科目三考试一定没问题!
  8. Pygal简介、画廊--各种图形绘图代码
  9. python logger_Python:logging 的巧妙设计!
  10. 深度学习笔记——生成模型
  11. openquery 如果执行存储过程_ORA-01502--记一次数据库索引失效导致执行存储过程出错...
  12. 5.3(将千克转换成磅)
  13. Atitit mtp ptp rndis midi协议的不同区别
  14. m3u8简单教程之我不是药神下载
  15. WebView如何引用本地字体
  16. Fedora34/35/36 软件闪退解决
  17. android 手机 报证书错误,安卓 ssl证书 安卓ssl证书出现错误的可能原因? - SSL网...
  18. nginx过滤HttpHeader的 中划线
  19. 软件工程毕业设计课题(63)微信小程序毕业设计JAVA校园新生报到小程序系统设计与实现
  20. OneNET物联网平台介绍

热门文章

  1. Banner轮播图的基本使用
  2. 阿里云云盾证书是什么?云盾证书有什么作用?
  3. Photoshop 通过快捷键来快速选择工具箱中的某一工具 ,快捷键大全
  4. Ipad开发课程系列目录--很好的教程,推荐给大家
  5. 数据分析师需要学什么?数据分析师必备的7种能力
  6. Html 用户反馈界面
  7. linux脚本date命令,Shell之date命令用法
  8. 华为云服务器如何使用
  9. github followers-following相互比较
  10. 小程序推广二维码生成