0

0

在JS开发中最实用的问题解答

亚连

亚连

发布时间:2018-05-17 11:26:57

|

1418人浏览过

|

来源于php中文网

原创

可维护性

编写可维护的代码很重要,因为大部分开发人员都花费大量时间维护他人代码。很难从头开始开发新代码的,很多情况下是以他人成果为基础的。确保自己代码的可维护性,以便其他开发人员在此基础上更好的开展工作。

什么是可维护的代码?

可理解性:其他人可以接手代码并理解它的意图和一般途径,而无需原开发人员的完整解释

直观性:代码中的东西一看就能明白,不管其操作过程多么复杂

可适应性:代码以一种数据上的变化不要求完全重写的方法撰写

可扩展性:在代码架构上已考虑到在未来允许对核心功能进行扩展

可调试性:当有地方出错时,代码可以给予你足够的信息来尽可能直接地确定问题所在

代码约定

代码约定是一种让代码变得可维护的简单途径是形成一套JavaScript代码的书写约定。 
可读性:要让代码具有可维护性,首先他必须可读。可读性的大部分内容都是和代码缩进相关的,还有一方面是注释。包括以下几个方面:

函数和方法:每个函数或方法都应该包含一个注释,描述其目的和用于完成任务所可能使用的算法。陈述事先的假设也非常重要,如参数代表什么,函数是否有返回值

大段代码:用于完成某个任务的多行代码应该在前面放一个描述任务的注释

复杂的算法: 如果你使用了一种独特的方式解决某个问题,则要在注释中注释你是如何做的。这不仅仅可以帮助其他浏览你代码的人,也能在下次你自己查阅代码的时候帮助理解。

Hack:因浏览器差异问题,js代码一般会包含一些hack。如果因为某种浏览器无法使用普通的方法,所以你需要用一些不同的方法,请放入注释中。

变量和函数名

命名规则如下:

变量名应为名词如car或person

函数名应以动词开始,如getName()。返回布尔值的函数以is开头,如isEnable()

变量名和函数都应使用合乎逻辑的名字,不要担心长度。长度可以通过后处理和压缩来缓解

变量类型透明

有三种方式表明变量数据类型的方式:

初始化:当定义一个变量后,它应该被初始为一个值,来暗示它将来如何应用。 
比如:var found = false; 
初始化为一个特定的数据类型可以很好的指明变量的类型。但缺点是它无法用于函数声明中的参数。

使用匈牙利标记法来指定变量类型 
“o”代表对象,”s”代表字符串,”i”代表整数,”f”代表浮点数,”b”代表布尔型 
比如:var bFound;//布尔型 
匈牙利标记法的好处是函数参数一样可以使用。但是缺点是让代码某种程度上难以阅读,阻碍了没有用它时代码的直观性和句子式的特质。

使用类型注释

var found/*:Booldan*/=false;1

类型注释的缺点是你不能使用多行注释一次性注释大块的代码,因为类型注释也是多行注释,两者会冲突。

松散耦合

只要应用的某个部分过分依赖于另一部分,代码就是耦合过紧、难于维护。典型的问题如:对象直接引用另一个对象,并且当修改其中一个的同时需要修改另外一个。紧密耦合的软件难于维护并且需要经常重写。

解耦html/javascript

html和javascript各自代表了解决方案中的不同层次:html是数据,javascript是行为。因为他们天生就需要交互,所以有多种不同的方法将这两个技术关联起来。

情况一:直接写在html中的javascript,使用包含内联代码的

解耦css/javascript

另外一个web层则是css,它主要负责页面的显示。 
最常见的紧密耦合例子是使用javascript来更改某些样式,如下所示:

//css对javascript的紧密耦合  
element.style.color = "red";  element.style.backgroundColor = "blue";  123

由于CSS负责页面的显示,当显示出现问题时应该只是查看CSS文件来解决。然而,当使用了JavaScript来更改某些样式的时候,如上面代码所示,就出现了第二个可能已更改的和必须检查的地方。结果是JavaScript也在某种程度上负责了页面的显示,并与CSS紧密耦合了。如果将来需要修改样式,CSS和JavaScript文件可能都需要修改,这会给维护人员带来噩梦。 
解耦合的原则: 
虽然不可能完全将css和javascript解耦,但是还是能让耦合更松散的,这是通过动态改变样式类而非特定样式来实现的,如下所示:

//css对javascript的松散耦合   element.className = "edit";  12

通过只修改某个元素的css类,就可以让大部分样式信息严格保留在css中。JavaScript可以改变样式类,但并不会直接影响到元素的样式,只要使用了正确的类,那么任何显示问题都可以直接追溯到css而非JavaScript。

第二类紧密耦合仅会在IE中出现(标准模式下的IE8不会出现),它可以在css中通过表达式嵌入javascript,例如:

/*javascript对css的紧密耦合*/   div{   
width:expression(document.body.offsetwidth-10+"px");  
}1234

通常要避免使用表达式,因为他们不能跨浏览器兼容,还因为它们所引入的JavaScript和css之间的紧密耦合。 
好的层次划分是非常重要的。显示问题的唯一来源应该是css,行为问题的唯一来源应该是javascipt.在这些层次之间保持松散耦合可以让你的整个应用更加易于维护。

解耦应用逻辑/事件处理程序

很少有能仔细得将应用逻辑从事件处理程序中分离的。例如:

fuction handleKeyPress(event){  
if(event.keyCode == 13){  
 var target = eventUtil.getTarget(event);  
 //应用逻辑部分
 var value = 5 * parseInt(target.value);  
 if(value >10){    
 document.getElementById("error-msg").style.display = "block";   
            }  
        }  
}12345678910

这段代码除了包含应用逻辑,还进行了事件的处理。 
这种方式的问题有其双重性:首先,除了通过事件之外就再没有方法执行应用逻辑,让调试变得困难。如果没有发生预想的结果怎么办?是不是表示事件处理程序没有被调用还会死指应用逻辑失败?其次,如果一个后续的事件引发同样的应用逻辑,那就必须复制功能代码或将代码抽取到一个单独的函数中。无论如何,都要做比实际所需更多的改动。

较好的方法是将应用逻辑和时间处理程序分离,这两者分别处理各自的东西。一个事件处理程序应该从事件对象中提取相关信息,并将这些信息传送到处理应用逻辑的某个方法中。例如前面的代码重写为:

//处理应用逻辑function validateValue(value){  
var value = 5 * parseInt(value);  
 if(value >10){  
 document.getElementById("error-msg").style.display = "block";   
}  
} 
//事件处理函数  fuction handleKeyPress(event){  
 if(event.keyCode==13){  
var target = EventUtil.getTarget(event);  
validateValue(target.value);  
}  
} 1234567891011121314

好处:从事件处理程序中分离应用逻辑有几个好处。首先,可以让你更容易更改触发特定过程的事件。如果最开始由鼠标点击事件触发过程,但现在按键也要进行同样处理,这种更改就很容易。其次,可以在不附加到事件的情况下测试代码,使其更容易创建单元测试或者是自动化应用流程。 
以下是要牢记的应用和业务逻辑之间松散耦合的几条原则:

勿将event对象传递给其他方法;只传来自event对象中所需的数据

任何可以在应用层面的动作都应该可以在不执行任何事件处理程序的情况下进行;

任何事件处理程序都应该处理事件,然后将处理转交给应用逻辑。

牢记着几条可以在任何代码中都获得极大的可维护性的改进,并且为进一步的测试和开发制造了很多可能。

js性能

优化DOM交互

在js中,DOM毫无疑问是最慢的一部分。DOM操作与交互要消耗大量时间,因为它们往往需要重新渲染整个页面或者一部分。理解如何优化与DOM的交互可以极大提高脚本完成的速度。

最小化现场更新

一旦你需要访问的DOM部分是已经显示的页面的一部分,那么你就是在进行一个现场更新,因为需要立即对页面对用户的显示进行更新。 
每一个更改,不管是插入单个字符,还是移除整个片段,都有一个性能惩罚,因为浏览器要重新计算无数尺寸以进行更新。现场更新进行得越多,代码完成执行所花的时间就越长,完成一个操作所需的现场更新越少,代码就越快。 
demo1:

    12345678910111213

    上面这段代码为列表添加了1000个项目,添加每个项目时,都需要2个现场更新:一个添加

  • 元素,另一个给它添加文本节点。这样添加1000个项目,这个操作总共要完成2000个现场更新。 
    修正这个瓶颈(需要减少现场更新的数量)有两种方法: 
    1.将列表从页面上移除,最后进行更新,最后再讲列表插回到同样的位置。这个方法的问题在于:每次页面更新的时候都会出现不必要的闪烁。 
    2.使用文档碎片来构建DOM结构,接着将其添加到List元素中。这种方式避免了现场更新和页面闪烁的问题。(请看Demo2) 
    Demo2:
      12345678910111213141516

      在这个例子中只有一次现场更新,它发生在所有项目都创建好之后。文档碎片用作一个临时的占位符,放置新创建的项目,然后使用appendChild()将所有项目添加到列表中。 
      一旦需要更新DOM,考虑使用文档碎片来构建DOM结构,然后再将其添加到现在的文档中。 
      两个Demo的执行时间比较: 

      使用innerHTML

      在页面上创建DOM节点的方法: 
      1.使用诸如createElement()和appendChild()之类的DOM方法 
      2.使用innerHTML 
      对于小的DOM更改而言,两种方法效率都差不多,然而,对于大的DOM更改,使用innerHTML要比使用标准DOM方法创建同样的DOM结构快得多。 
      原因:当把innerHTML设置为某个值时,后台会创建一个HTML解析器,然后使用内部的DOM调用来创建DOM结构,而非基于JavaScript的DOM调用。由于内部方法是编译好的而非解释执行的,所以执行快得多。 
      Demo:

        12345678910111213

        使用事件代理

        页面上的事件处理程序的数量和页面响应用户交互的速度之间是负相关。为了减少这种惩罚,最好使用事件代理。 
        事件代理:用到了事件冒泡。任何可以冒泡的事件都不仅仅可以在事件目标上进行处理,目标的任何祖先节点上也能处理。利用这一点,就可以将事件处理程序附加到更高层的地方负责多个目标的事件处理。如果在文档级别附加事件处理程序,这样可以处理整个页面的事件。 
        Demo:

        
            
            
            事件委托添加更多节点123456789101112131415161718192021222324252627282930313233343536373839404142

        事件委托好处: 
        1.能够有效减少页面上事件处理程序的数量 
        2.对于动态增加的子节点,依旧能够实现事件的绑定

        最小化访问HTMLCollection的次数

        最小化访问HTMLCollection的次数可以极大地改进脚本的性能

        123456789101112

        注意作用域

        避免全局查找

        可能优化脚本性能最重要的就是注意全局查找。使用全局变量和函数肯定要比局部的开销更大,因为要涉及作用域链上的查找。 
        下面的代码包含了3个对于全局document对象的引用。如果在页面上有多个图片,那么for循环中的document引用就会被执行多次甚至上百次,每次都会进行作用域链查找。

        123456789101112131415161718192021222324

        下面的例子中通过创建一个指向document对象的局部变量,就可以通过限制一次全局查找来提升这个函数的性能。

        123456789101112

        避免with语句

        with语句会创建自己的作用域,因此会增加其中执行的代码的作用域链的长苏。由于额外的作用域链查找,在with语句中执行的代码肯定会比外面执行的代码要慢。 
        看下面这个例子:

        123456789101112131415161718

        大多数情况下,可以使用局部变量完成相同的事情而不必引入新的作用域

        上面是我整理给大家的js开发中最实用的问题解答,希望今后会对大家有帮助。

        相关文章:

        php商城系统
        php商城系统

        PHP商城系统是国内功能优秀的网上商城系统,同时也是一个商业的PHP开发框架,有多套免费模版,强大的后台管理功能,专业的网上商城系统解决方案,快速建设网上购物商城、数码商城、手机商城、办公用品商城等网站。 php商城系统v3.0 rc6升级 1、主要修复用户使用中出现的js未加载完报错问题,后台整改、以及后台栏目的全新部署、更利于用户体验。 2、扩展出,更多系统内部的功能,以便用户能够迅速找到需

        下载

        重点解答js的几种提交方式

        详细讲解JS中Windows对象课程

        如何在标签中一样可以使用el表达式

      • 热门AI工具

        更多
        DeepSeek
        DeepSeek

        幻方量化公司旗下的开源大模型平台

        豆包大模型
        豆包大模型

        字节跳动自主研发的一系列大型语言模型

        通义千问
        通义千问

        阿里巴巴推出的全能AI助手

        腾讯元宝
        腾讯元宝

        腾讯混元平台推出的AI助手

        文心一言
        文心一言

        文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

        讯飞写作
        讯飞写作

        基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

        即梦AI
        即梦AI

        一站式AI创作平台,免费AI图片和视频生成。

        ChatGPT
        ChatGPT

        最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

        相关专题

        更多
        俄罗斯Yandex引擎入口
        俄罗斯Yandex引擎入口

        2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

        386

        2026.01.28

        包子漫画在线官方入口大全
        包子漫画在线官方入口大全

        本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

        135

        2026.01.28

        ao3中文版官网地址大全
        ao3中文版官网地址大全

        AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

        233

        2026.01.28

        php怎么写接口教程
        php怎么写接口教程

        本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

        8

        2026.01.28

        php中文乱码如何解决
        php中文乱码如何解决

        本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

        13

        2026.01.28

        Java 消息队列与异步架构实战
        Java 消息队列与异步架构实战

        本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

        10

        2026.01.28

        Python 自然语言处理(NLP)基础与实战
        Python 自然语言处理(NLP)基础与实战

        本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

        24

        2026.01.27

        拼多多赚钱的5种方法 拼多多赚钱的5种方法
        拼多多赚钱的5种方法 拼多多赚钱的5种方法

        在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

        124

        2026.01.26

        edge浏览器怎样设置主页 edge浏览器自定义设置教程
        edge浏览器怎样设置主页 edge浏览器自定义设置教程

        在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

        98

        2026.01.26

        热门下载

        更多
        网站特效
        /
        网站源码
        /
        网站素材
        /
        前端模板

        精品课程

        更多
        相关推荐
        /
        热门推荐
        /
        最新课程
        React 教程
        React 教程

        共58课时 | 4.3万人学习

        TypeScript 教程
        TypeScript 教程

        共19课时 | 2.5万人学习

        Bootstrap 5教程
        Bootstrap 5教程

        共46课时 | 3.1万人学习

        关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
        php中文网:公益在线php培训,帮助PHP学习者快速成长!
        关注服务号 技术交流群
        PHP中文网订阅号
        每天精选资源文章推送

        Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号