一些实战中总结的 javascript 开发经验
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 开发经验的更多相关文章
- 【JavaScript】javascript中伪协议(javascript:)使用探讨
javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...
- JavaScript中伪协议 javascript:研究
将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的 ...
- JSP编程中常用的JavaScript技术(转载)
1.<tronMouseOver=this.style.backgroundColor=’#FFFFFF’ onMouseOut=this.style.backgroundColor=”> ...
- 转:Yii实战中8个必备常用的扩展,模块和widget
转载自:http://www.yiiframework.com/wiki/180/yii8/ 在经过畅K网的实战后,总结一下在Yii的项目中会经常用到的组件和一些基本的使用方法,分享给大家,同时也给自 ...
- JavaScript 开发经验整理
前言 今年接触了一个B/S的项目,总结了一些JavaScript开发经验,整理些有用的内容与大家分享. 本文会持续更新... 1.实现代码访问的控制 随着项目JavaScript代码库扩大,本应被控制 ...
- 如何在 FineUIMvc 中引用第三方 JavaScript 库
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...
- iOS中动态注入JavaScript方法。动态给html标签添加事件
项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...
- 关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态
关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态 由于火狐浏览器没有安装 Adobe Flash Player 19 NPAPI这个插件 安装好了之后就可以直接运行了
- Bugku-CTF之网站被黑(这个题没技术含量但是实战中经常遇到)
Day11 网站被黑 http://123.206.87.240:8002/webshell/
随机推荐
- LeetCode93 Restore IP Addresses
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- hdu 1503 LCS输出路径【dp】
hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...
- ERROR: epmd error for host "yourhostname": timeout
安装完rabbitmq-server.重新启动时间非常长,而且报错ERROR: epmd error for host "yourhostname": timeout 原因是:主机 ...
- laravel中如何实现验证码验证及使用
开发环境: laravel5.5 php7.1.11 mysql 验证码 是防止恶意破解密码.刷票.论坛灌水.刷页的手段.验证码有 多种类型. 现在我给大家实现如何使用图片验证码,其原理是让用户输入一 ...
- 9-1进程,进程池和socketserver
一 进程: # 什么是进程 : 运行中的程序,计算机中最小的资源分配单位# 程序开始执行就会产生一个主进程# python中主进程里面启动一个进程 —— 子进程# 同时主进程也被称为父进程# 父子进程 ...
- 前端知识---html
HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...
- 箭头函数表达式和声名式函数表达式的区别以及 Function.prototype的bind, apply,call方法
箭头函数不能用做构造函数 箭头函数没有arguments参数 箭头函数没有自己的this,是从作用域链上取this,是与箭头函数定义的位置有关的,与执行时谁调用无关,所以用call,apply,bin ...
- CSS像素设置为整数,渲染结果像素带有小数
今天进行网页设计学习时,CSS代码设计width:300px,但实际显示像素如下图所示为199.99px. 最后发现是浏览器运用了缩放,恢复100%的缩放后,像素显示为整数.
- python-字符编码数据类型转换
1 - 编码格式转换 1.1 编码格式介绍 字符集 介绍 ASCII ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 ANSI ANSI是一种字符代码,为使计算 ...
- activiti 如何使用database前缀来区分activiti数据库和业务数据库
为什么80%的码农都做不了架构师?>>> 第一步是先集成好activiti,我使用的是5.22.0,使用springboot集成,pom文件如下: <parent> ...