Javascript 的很多扩展的特性是的它变得更加的犀利, 同时也给予程序员机会创建更漂亮并且更让用户喜欢的网站。

尽管很多的开发人员都乐于颂扬 javascript,但是仍旧有人看到它的阴暗面。

使用很多 javascript 代码的 web 页面会加载很慢,过多的使用 javascript 使得网页丑陋和拖沓。很快如何有效地使用 javascript 成为一个非常火热的话题。

这里让我们列出 10 个最佳 javascript 实践,帮助你有效地使用 javascript。

1. 尽可能的保持代码简洁

可能大家都听到过了N遍这个代码简洁问题了。作为一个开发人员你可能在你的代码开发过程中使用了很多次,但千万不要在 js 开发中忘记这点。

  • 尽量在开发模式中添加注释和空格,这样保持代码的可读性
  • 在发布到产品环境前请将空格和注释都删除,并且尽量缩写变量和方法名
  • 使用第三方工具帮助你实现压缩 javascript。

2. 思考后再修改 prototypes

添加新的属性到对象 prototype 中是导致脚本出错的常见原因。

yourObject.prototype.anotherFunction = ‘Hello’;
yourObject.prototype.anotherMethod = function () { … };

在上面代码中,所有的变量都会被影响,因为他们都继承于 yourObject。这样的使用会导致意想不到的行为。所以建议在使用完后删除类似的修改。

yourObject.prototype.anotherFunction = ‘Hello’;
yourObject.prototype.anotherMethod = function () { … };
test.anotherMethod();
delete yourObject.prototype.anotherFunction = ‘Hello’;
delete yourObject.prototype.anotherMethod = function () { … };

3. Debug Javascript 代码

即使最好的开发人员都会犯错。为了最大化的减少类似错误,请在你的 debugger 中运行你的代码,确认你没有遇到任何细微的错误

4. 避免 Eval

你的 JS 在没有 eval 方法的时候也可以很好的工作。eval 允许访问 javascript 编译器。如果一个字符串作为参数传递到 eval,那么它的结果可以被执行。

这会很大的降低代码的性能。尽量避免在产品环境中使用 eval

5. 最小化 DOM 访问

DOM 是最复杂的 API,会使得代码执行过程变慢。有时候 web 页面可能没有加载或者加载不完整。最好避免 DOM。

6. 在使用 javascript 类库之前先学习 javascript

互联网充斥着很多的 javascript 类库,很多程序员都往往使用 js 类库而不理解负面影响。强烈建议你在使用第三方类库之前学习基本的 JS 代码,否则,你就准备着倒霉吧。

7. 不要用 "SetTimeOut" 和 "Setinterval" 方法来作为 "Eval" 的备选

setTimeOut( "document.getID('value')", 3000);

在以上代码中 document.getID('value') 在 setTimeOut 方法中被作为字符串来处理。 这类似于 eval 方法,在每个代码执行中来执行一个字符串,因此会降低性能,因此,建议在这些方法中传递一个方法。

setTimeOut(yourFunction, 3000);

8. [] 比 new Array(); 更好

一个常犯的错误在于使用当需要数组的时候使用一个对象或者该使用对象的时候使用一个数组。但是使用原则很简单:

“当属性名称是小的连续整数,你应该使用数组。否则,使用一个对象” - Douglas Crockford, JavaScript: Good Parts 的作者.

建议:

var a = ['1A','2B'];

避免:

var a = new Array();
a[0] = "1A";
a[1] = "2B";

9. 尽量不要多次使用 var

在初始每一个变量的时候,程序员都习惯使用 var 关键字。相反,建议你使用逗号来避免多余的关键字,并且减少代码体积。 如下:

var variableOne = ‘string 1’,
variableTwo = ‘string 2’,
variableThree = ‘string 3’;

10. 不要忽略分号 ";"

这往往是大家花费数个小时进行 debug 的原因之一。

我很确信你肯定也在其它的文章中阅读过以上相关的内容,但是大家可能往往都忽略了很多基本的规则。 你是不是也曾经忽略过分号。是不是也遇到过 eval 关键字问题导致性能问题?

希望大家能够喜欢,谢谢!

11. 尽量把DOM操作和数据操作分开

尽量不要在循环DOM获取数据的同时,在同一个循环里去处理数据,然后又在同一个循环里操作DOM把处理好的数据渲染出来,这样看起来是节省了两遍循环,其实会把数据的获取、数据的处理、数据的渲染 三个过程的逻辑紧密耦合在一起,为后期维护、扩展埋下巨大的麻烦。

正确的做法应该是:
1、一个函数专门用来循环DOM,取一遍列表里面的数据,输出数据;

2、一个函数专门接收需要处理的数据,循环数据处理一遍,输出数据;

3、一个函数专门接收处理后的数据,循环一遍DOM,把处理后的数据渲染到DOM里去;

任何程序,其基本流程不外乎为三个: 输入数据、处理数据、输出数据,这三个流程必须分开

前端降低耦合的天条:读取数据、处理数据、输出数据三大逻辑必须分离,只要性能、可维护性、开发成本 三者能平衡,哪怕代价是牺牲一些性能,也是值得的。

12. 尽可能减少全局变量的使用

1、尽量以传参的方式来输入数据,避免硬编码;

2、如果必须要用全局变量,要记得命名空间;

3、尽量使用模块化的方式来组织代码,一个函数只执行一个功能;

13.新手在理解复用和解耦概念时,容易陷入的误区

软件工程中的复用,是指软件模块上的复用,而不是代码和语句块上的复用,新手最容易陷入的“复用”陷阱,有两个:

1、在一个循环中塞入很多东西,感觉自己“复用”了这个循环,节省了几个循环,所以又“复用”又提升了代码效率。

一个循环里面干了那么多事情,又是读取数据,又是处理数据,又是渲染数据,省了几个循环,多节省啊!但这就是导致强耦合作死的开始。

说到函数的复用,新手又开始陷入另外一种陷阱:

2、在一个函数中,由于几个处理逻辑流程相差不大,于是就在一个函数中塞入尽可能多的流程逻辑,用参数来区别不同的流程。

这种本质上还是代码语句块上的复用,也是强耦合,后期也会很麻烦,不利于扩展和复用,而且对性能的好处极其有限。

复用,一定要记得:是软件模块上的复用,至少是函数功能级别上的复用,代码语句块上的复用,没有任何意义。

另外,函数不是随便写的,既然要引入工程化的工作流来开发软件,那函数、逻辑、模块肯定是要划分层分级的,不同层级的函数,其逻辑粒度不同。


低阶级的函数(底层函数):逻辑必须足够单纯,功能上必须保持极细的粒度,性能上必须保证尽可能高效的运行,以便能构建足够个性化、高效率的高阶函数。

 

 高阶函数:高阶函数是由低阶级的函数构建而成的,是为更高层的模块和业务提供服务的,必须要综合考虑 函数的运行效率、开发效率(复用)、可扩展性、可维护性、开发成本等更高层级方面的需求,来满足更高层级对于下层函数的需求。

 

业务模块:使用高阶函数或低级别的业务模块,根据本模块的业务逻辑,来构建模块,然后从而一层层构建起整个软件模块,完成整个软件工程。

  

不是性能决定生死的项目,在逻辑划分上,要以解耦+复用为第一原则,尽可能让逻辑变得 低耦合 + 高复用,逻辑的分层,本质上也是为了低耦合、高复用。

 

软件工程,主要研究的具体内容,就是软件开发中:函数逻辑如何组织,函数层次怎么划分,模块如何划分,如何互通和兼容,函数与函数、模块与模块、层级与层级之间的关系应该遵循什么样的原则和范式,才能保证整个工程开发低成本、开发效率高、性能满足要求、容易扩展、容易维护、安全性满足要求,功能上满足业务需求。

3、谨记所谓 "好莱坞原则",在分层结构中,上层依赖于下层,依赖必须是单向的。即:低层模块(或者叫公共模块更容易理解)不得”实现高层模块(或者叫具体业务模块)中声明并被高层模块调用的接口“,你不能将父类型放在上层,而让下层(子类)依赖于上层。

4、如果想了解更多关于软件架构方面的知识,可以搜索“面向对象类关系的设计原则”   和 “软件架构设计的原则

14、面向对象只是复用和解耦逻辑的一种方式,有自己的适用场景和范围,不是每个项目,每个组件都要使用面向对象的思考方式来编程,有些组件可以写成对象,有些不能写成对象。

一些实战中总结的 javascript 开发经验的更多相关文章

  1. 【JavaScript】javascript中伪协议(javascript:)使用探讨

    javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...

  2. JavaScript中伪协议 javascript:研究

    将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的 ...

  3. JSP编程中常用的JavaScript技术(转载)

    1.<tronMouseOver=this.style.backgroundColor=’#FFFFFF’ onMouseOut=this.style.backgroundColor=”> ...

  4. 转:Yii实战中8个必备常用的扩展,模块和widget

    转载自:http://www.yiiframework.com/wiki/180/yii8/ 在经过畅K网的实战后,总结一下在Yii的项目中会经常用到的组件和一些基本的使用方法,分享给大家,同时也给自 ...

  5. JavaScript 开发经验整理

    前言 今年接触了一个B/S的项目,总结了一些JavaScript开发经验,整理些有用的内容与大家分享. 本文会持续更新... 1.实现代码访问的控制 随着项目JavaScript代码库扩大,本应被控制 ...

  6. 如何在 FineUIMvc 中引用第三方 JavaScript 库

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...

  7. iOS中动态注入JavaScript方法。动态给html标签添加事件

    项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...

  8. 关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态

    关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态 由于火狐浏览器没有安装 Adobe Flash Player 19 NPAPI这个插件 安装好了之后就可以直接运行了

  9. Bugku-CTF之网站被黑(这个题没技术含量但是实战中经常遇到)

    Day11   网站被黑   http://123.206.87.240:8002/webshell/    

随机推荐

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段 代码工程地址: https://github. ...

  2. html5之div,article,section区别与应用

    div 块级元素,在里面的内容会自动开始新行,可以定义文档中的分区或节,把文档分割成独立,不同的部分 本身没有什么语义,更适合帮助布局,进行样式化. <div> </div> ...

  3. PHP判断图片格式的七种方法小结

    <?php $imgurl = "http://www.jb51.net/images/logo.gif"; //方法1 echo $ext = strrchr($imgur ...

  4. mysql带有子查询的like查询

    SELECT * FROM by_app_categories WHERE c_name LIKE CONCAT('%', (SELECT `name` FROM b_catelist WHERE t ...

  5. C++中用stringstream类进行数据类型的转换

    我们在进行C++编程过程中,经常需要进行数据类型的转换. stringstream 类的作用就是进行数据类型转换.要想在程序中使用 stringstream 类,我们需要在源程序文件中包含头文件inc ...

  6. js+canvas制作前端验证码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 8-2udp和tcp网络编程以及粘包和解决粘包的方法

    一  tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...

  8. 第三期 行为规划——4.形式化FSM

    让我们考虑一个简单的自动售货机,其中一切花费20美分.假设这台自动售货机只需要镍和硬币,但没有更大或更小. 然后,我们可以模拟状态这台自动售货机以已存入的金额为准.起始状态将为零美分.有两种可能发生. ...

  9. HTML的基本结构和标签分类

    HTML:超文本标记语言 HTML基本结构 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  10. History和Location

    Location 对象属性属性 描述hash 设置或返回从井号 (#) 开始的 URL(锚).host 设置或返回主机名和当前 URL 的端口号.hostname 设置或返回当前 URL 的主机名.h ...