前端代码标准最佳实践:javascript篇

前言

最近一直重构项目的前端代码,也参考了各种前端代码的最佳实践,目的是让前端的HTML,CSS,Javacript代码更符合标准,有更好的性能,更好的可维护性,尝到了重构后的甜头,也萌生了写这个系列博客的念头。前端代码有其固有的灵活性,这就导致了目前前端代码非常混乱的局面,本系列文章希望能起到抛砖引玉的作用,让更多的人重视前端代码的质量,编写更标准的前端代码。

本系列文章共有三篇,分别讨论HTML,CSS,Javascript,本篇将讨论Javascript。

javascript是灵活性非常高的一种脚本语言,使得用其实现的同样功能有多种多样的写法,那么在项目中如果没有统一的规范,就会造成javascript代码难以维护,随着项目的深入,性能j也越来越差,文件也越来越大。所以尽早制定统一的编码规范是非常必要的,下面是整理的一些javascript规范供大家参考。

(1)编码格式

好的编码格式,不同人有不同的看法,但是在同一个项目中一定要有统一的格式。下面是常用的编码格式:

1,缩进: 不使用tab(\0x09)缩进,以4个空格作为逻辑的缩进。

2,左花括号应该在行的结束,而不应该单独一行。应该一直使用花括号括起逻辑块,即使逻辑只有一行,应该也用花括号括起来,这样提高了代码的可读性。例如:

  1. for (var i=0; i<100; i++) { 
  2.      doSomething(i);  
  3. if (statement) { 
  4.     doSomeThing; 
  5. } else { 
  6.     doSomeThing; 

3,用单引号定义字符串。javascript中可以用单引号或者双引号定义字符串,但是因为习惯于在html中elements的属性值的定义使用双引号,而javascript中又经常包含html代码,所以字符串定义使用单引号也是方便于在字符串内部包含含有双引号的html代码。

  1. var content = '<span id="spanid">…'

4,注释:如果注释不是占有多行,建议使用//,不推荐使用/**/,注释应该单独占用一行,而不是写在和代码相同一行的右边。

5,空格:空格的作用是提高代码的可读性,在函数参数的逗号后面使用一个空格,在操作符前后使用一个空格,

  1. doSomething(myChar, 0, 1); while (x === y) 

6,分号:语句结束一定要使用分号,使用分号是为了在压缩js代码时不至于出现js的编译错误,因为压缩的时候是删除了所有的空格和回车符的。

(2)命名规则

遵循规范的命名规则,提高了代码的可读性,好的命名本身就是好的注释。

1,大小写:现在较流行javascript的面向对象编程,那么就会有公有或私有的概念,原则是公有接口的命名首字母大写,私有接口的命名首字母小写。

2,命名:禁止使用各种缩写,命名应该描述其意义,而不是描述其类型,禁止使用标识类型的前缀

不推荐

  1. getWin 
  2. function doSomething(str,  integer) { 
  3.      ... ... 
  4. function doSomething(strMessage,  intLength) {  
  5.     ...  ... 

正确命名

  1. getWindow function doSomething(message, length) { ... ... } 

(3)编程规范

javascript的编程规范关乎代码的性能,代码的简洁。

1,变量定义

变量定义使用关键字var。非必需,不要使用全局变量,这样可以减少不必要的变量定义查询。变量应该有个初始化的值,或者设置为null。避免使用关键字with,with的性能差。集中定义变量,减少代码量。

  1. var counter = 0empty = null

2,函数定义

函数定义应该在其使用之前。函数内部的函数应该定义在变量之后。减少定义全局函数。函数定义为立即执行,应该用括号包含函数定义体,这样可读性好。

  1. var statement. 
  2. function outer(c, d) { 
  3.     var e = c * d; 
  4.  
  5.     function inner(a, b) { 
  6.         return (e * a) + b; 
  7.     } 
  8.  
  9.     return inner(0, 1); 
  10.  
  11. var collection = (function () { 
  12.     var keys = [], values = []; 
  13.  
  14.     return { 
  15.         get: function () { 
  16.             ...... 
  17.         } 
  18.     }; 
  19. }()); 

3,函数多次调用,应该使用函数别名。比如在循环中多次调用某个函数,应该定义一个函数别名,减少调用范围链的跳转,提高性能。

  1. function doSomething() { 
  2.     var get = getDataByIndex
  3.  
  4.      for (var counter = 0; counter < 10000; counter++) { 
  5.         var current = get(counter); 
  6.  
  7.         // ... 
  8.     } 

4,值比较尽量使用严格比较操作符,减少类型的转换操作。

  1. if (x === 5 && y !== 4) 

5,循环与递归:尽量把性能差的操作放在循环外部。预先计算在循环中要使用的值。在上下文中有多个循环时,定义一个统一的循环变量,避免变量无意义的多次定义。

错误编码

  1. // example 1 
  2. for (var counter = 0; counter < 10000; counter++) { 
  3.     try { 
  4.        doSomething(); 
  5.     } catch (e) { 
  6.     alert('Failure: ' + e); 
  7.         break; 
  8.     } 
  9.  
  10. // example 2 
  11. for (var counter = 0
  12. counter < document.getElementsByTagName('div').length; 
  13. counter++) { 
  14.     doSomething(); 
  15.  
  16. // example 3 
  17. for (var counter = 0; counter < 10; counter++) { 
  18.     doSomething1(); 
  19. }; 
  20.  
  21. for (var counter = 0; counter < 10; counter++) { 
  22.     doSomething2(); 
  23. }; 

正确编码

  1. // example 1 
  2.  try { 
  3.     for (var counter = 0; counter < 10000; counter++) { 
  4.          doSomething(); 
  5.      } 
  6. } catch (e) { 
  7.     alert('Failure: ' + e); 
  8.  
  9.  
  10. // example 2 
  11. var target = document.getElementsByTagName('div').length; 
  12. for (var counter = 0;counter < target ;counter++) { 
  13.     doSomething(); 
  14.  
  15. // example 3 
  16. var counter = 0
  17. for (counter = 0; counter < 10; counter++) { 
  18.     doSomething1(); 
  19. }; 
  20. for (counter = 0; counter < 10; counter++) { 
  21.     doSomething2(); 
  22. }; 

6,Dom操作:减少Dom树的更新次数,尽量合并Dom树的更新操作,提高性能。减少赋值给innerHTML的次数。避免给Dom objects上的expando属性赋值,减少可能的内存泄漏。

7,使用全局的变量和方法:避免使用eval,eval非常耗性能。如果要使用全局的变量或方法,应该加上window,减少上下文的定义查找。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置springboot在访问404时自定义返回结果以及统一异常处理

在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息。 如下是springBoot自带的错误结果信息: 1 { 2 "timestamp": 1492063521109, 3 &…

nginx配置php 9000,Nginx支持php配置

Nginx本身是不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux 下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wra…

用例写到抽筋

这几天是第一次写web类的测试用例,不得不说,写web类的测试用例真是会写死人,每一项都要至少写一个测试用例,就算以一项一个用例来算,一个非常非常简单的网站都要写上上百个测试用例。比如说今天写的测试用例中&#xf…

ansible 判断和循环

标准循环 模式一 - name: add several usersuser: name{{ item }} statepresent groupswheelwith_items:- testuser1- testuser2 orwith_items: "{{ somelist }}" 模式2. 字典循环- name: add several usersuser: name{{ item.name }} statepresent groups{{ item.g…

Windows XP中快速识别真假SVCHOST.EXE

SVCHOST.EXE是基于NT核心技术的操作系统非常重要的进程,它提供许多系统服务,比如远程过程调用系统服务 (RPCSS)、动态主机配置协议(DPCH) 服务等与网络相关的服务。现在广大计算机用户普遍使用的Windows XP、Windows 2003等操作系统都涉及该进…

php require 500,thinkphp5出现500错误怎么办

thinkphp5出现500错误,如下图所示:require(): open_basedir restriction in effect. File(/home/wwwroot/pic/thinkphp/start.php) is not within the allowed解决方法:1、我是lnmp1.4 php5.6,php.ini里面的open_basedir 是注释掉…

eclipse从svn导入maven项目变成普通项目解决办法

右击项目-->configure-->Convert to Maven Project转载于:https://www.cnblogs.com/zhanzhuang/p/9105463.html

php安装soap扩展

例: 1、编译安装 解压对应php版本安装包 进入解压后的ext目录 phpize --生成configure文件,报以下错误,可以忽略 ------------------------------------------------------------------------------ Configuring for: PHP Api Version: …

php yaf 教程,Yaf教程2:入门使用

接下来我们通过最简单的“hello yaf”例子说明 Yaf 的用法,然后一步步走向更加复杂的用法。Yaf的PHP官方手册位置是:http://php.net/manual/zh/book.yaf.php,这比鸟哥(Yaf作者)自己博客 http://www.laruence.com/manual/的文档要新&#xff0…

在移动端项目中使用vconsole

1.先在项目中引入 <script type"text/javascript" src"vconsole.min.js"> 2.初始化vConsole window.vConsole new window.VConsole({defaultPlugins: [system, network, element, storage], // 可以在此设定要默认加载的面板maxLogNumber: 1000 });…

如何创建路径别名

在访问页面时&#xff0c;页面地址会以 DocumentRoot所指定的路径为相对路径&#xff0c;但若不想使用指定的路径&#xff0c;则需要创建路径别名。假如DocumentRoot为/var/www/html &#xff0c;现想将/var/www/html/mail 建立别名/web/mail&#xff0c;该如何修改呢&#xff…

matlab矩阵除以一个数字,matlab矩阵中每一行数除以一个数 | 学步园

例如&#xff1a;用a中每一行数除以x中相对应的每一个数x[5 10 6 8 16 6 8 8 22 11];a[4 4 4 5 4 4 4 4 3 46 8 6 2 6 8 8 6 8 64 4 4 4 6 4 4 4 6 44 6 6 4 6 6 6 4 7 410 14 14 10 12 12 12 10 14 123 5 5 3 6 3 3 4 5 44 6 7 4 4 4 4 4 6 64 6 6 6 5 6 5 5 7 613 16 19 16 1…

Redis(四):Spring + JedisCluster操作Redis(集群)

1.maven依赖&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> 2.增加spring 配置 <!-- JedisCluster配置 --> <bean …

js对象数组转java对象数组对象数组对象数组对象,前台js数组json字符串,后台json转为对象数组的具体实现...

$("#savaUserSet").click(function(){var JSONArr[];$("i[nameeventName]").each(function() {//获取所有name属性为eventName的i标签,并遍历if(!($(this).hasClass("active"))){var eventCode$(this).attr("id");var eventName$(this…

matlab绘制烟花,[原创]利用MATLAB燃放烟花(礼花)

function firework% 烟花烟花满天飞% CopyRight&#xff1a;xiezhh(谢中华)% 2011.6.25OldHandle findobj( Type, figure, Tag, FireWork ) ;if ishandle(OldHandle)close(OldHandle) ;end% 图形窗口初始化fig figure(units,normalized,position,[0.1 0.1 0.8 0.8],...menuba…

33 -jQuery 属性操作,文档操作(未完成)

转载于:https://www.cnblogs.com/venicid/p/9110130.html

GNU C - 关于8086的内存访问机制以及内存对齐(memory alignment)

接着前面的文章&#xff0c;这篇文章就来说说menory alignment -- 内存对齐. 一、为什么需要内存对齐&#xff1f; 无论做什么事情&#xff0c;我都习惯性的问自己&#xff1a;为什么我要去做这件事情&#xff1f; 是啊&#xff0c;这可能也是个大家都会去想的问题&#xff0c;…

mysql权限说法正确的是,【多选题】下面关于修改 MySQL 配置的说法中,正确的是...

参考答案如下【单选题】4.正常枕先露分娩时&#xff0c;多选的说仰伸发生于()39、题下【单选题】人们常常用来判断一种活动是不是游戏的一项外部指标是( )面关【多选题】S-S法阶段2训练内容包括于修【判断题】痉挛性睑内翻多发生于下睑。配置【判断题】萤火虫不仅成虫会发光,其…

读取exchange邮件的未读数(转载)

protected void Page_Load(object sender, EventArgs e) { Response.Write("administrator的未读邮件数是&#xff1a;" UnReadCount("administratordomainname")); } int UnReadCount(string userMailAddress) {…

嵌入式Linux下Qt的中文显示

一般情况下&#xff0c;嵌入式Qt界面需要中文显示&#xff0c;下面总结自己在项目中用到的可行的办法 1&#xff0c;下载一种中文简体字体&#xff0c;比如我用的是”方正准圆简体“&#xff0c;把字体文件放在ARM开发板系统的Qt字库中&#xff0c;即/usr/lib/fonts下 2&#x…