1、 JavaScript编程坏习惯
1.1 变量名以大小字母开头
变量名使用大写字母开头是个坏习惯,只有“构造器”(JS的类)才用大写字母开头。好多VB、C#等微软平台下的程序员都喜欢将变量的第一个字母大写,但 像Java这些编程语言的编程规范里也要求变量名以大写字母开头,这种camel写法在笔者认为更好。
1.2 不用var关键字定义一个新变量
若没有用var声明变量,则会在其使用后当成全局变量来处理,全局变量有很多“坏味道”,请看如下代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/javascript">
function foo() {
bar = 2; // bar变成了一个全局变量
var str = "Amigo";
}
foo();
alert("bar=" + bar);
alert("str=" + str);
</script>
</head>
</html>
第一个alert提示“2”,第二个alert因为str被定义为局部变量,所以出现JavaScript错误:str未定义。
1.3 忽略可读性
首先是使用工具来增加可读性(document.getElementsByClassName vs $())。其次是不能因为简洁而破坏可读性,比如不要使用太复杂的三目运算符(三目运算符里还包括另外一个三目运算符什么的最讨厌了……)。提高可读性的方法很多,有时候需要创建必要的变量。例如如下长长的语句:
document.getElementById(“imagegallery”).getElementByTagName(“a”)
可替换为如下两句容易理解的语句:
var gallery = document.getElementById(“imagegallery”);
var links = gallery. getElementByTagName(“a”);
《JavaScript: Bad Practices》一文中有很好的实例,可读性不够好的语句段如下:
document.getElementById('foo').style.border = '3px solid #FFF';
document.getElementById('foobar').style.border = '3px solid #FFF';
document.getElementById('foofoobar').style.border = '3px solid #FFF';
document.getElementById('foofoobarbar').style.border = '3px solid #FFF';
因为其设置的border值都一样,可以使用如下简短而可读性更好的语句:
var allMyFoos = '#foo, #foobar, #foofoobar, #foofoobarbar';
jQuery(allMyFoos).css('border', '3px solid #FFF');
1.4 过多的注释
良好的代码是最好的注释。如果你觉得你的代码太复杂,不用注释说不清楚,那可能你的代码写得不够清晰。只提供关键代码的注释,其余的代码应该是能够自注释的。
1.5 使用JavaScript拼接长长的HTML字符串
在代码中拼接长长的HTML字符串,非常不便理解,如果拼接的字符串需要使用innerHTML添加到document的某个元素中,可以采用别的办法(例如使用appendChild()方法添加元素):
var widgetStructure = '<div id=' + widgetID + '>' +
'<h2 id="' + widgetTitleID + '">' + widgetTitle + '</h2>' +
'<div id="' + widgetContentID + '" style="' + widgetContentStyles + '">' +
(function() {
var paras = '';
for (var i = 0; i < paraItems.length; ++i) {
paras += '<p>' + paraItems[i] + '</p>';
}
return paras;
})() +
'</div>' +
'</div>';
1.6 在循环中创建DOM元素
指的是当父元素里要创建很多子元素时,直接一个一个使用appendChild()方法拼接的速度不是很理想,应该先用document.createDocumentFragment创建一个fragment对象,用这个对象来appendChild(),再将这个fragment添加到父元素。另外作者还提到innerHTML还会更快。
如下是带着“坏味道”的实例:
for (var i = 0; i < 100; ++i) {
elementInDocument.appendChild(document.createElement('div'));
}
改造后的代码如下所示:
var fragment = document.createDocumentFragment();
for (var i = 0; i < 100; ++i) {
fragment.appendChild(document.createElement('div'));
}
elementInDocument.appendChild(fragment);
1.7 使用行内事件
例如如下代码中,使用了“javascript:”伪协议和“#”记号:
<a href="javascript:void doSomething();">Click</a>
<!--OR-->
<a href="#" onclick="return doSomething();">Click</a>
这样做的缺点很明显,首先它在HTML中混杂了JavaScript代码,没有遵循“分离JavaScript”的原则,可以在独立的js文件中为对应的链接添加处理事件,例如:
link[i].onclick = function() {
……
}
1.8 JavaScript功能被禁用时,没有预留后路
例如在如下代码中,当JavaScript被禁用时,因为href被设置为“#”,当JavaScript功能被禁用后,点击但不会引起任何动作:
<a href="#" onclick="return doSomething();">Click</a>
如果JavaScript方法只是为了做一些炫目或更理想化的用户体验,而后还是要跳转到某个地址,那么可以为这个href设置语句的地址,使得它能在JavaScript被禁用时,也能完成基本功能,而在对应的JavaScript处理方法中,只要返回false,href中的链接就不会被执行跳转。
1.9 将JS代码写入html/xhtml文件中
例如在如下代码中,使用<script>将一串JS代码写入到了html文件中:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>nodeName测试</title>
<script type="text/javascript">
window.onload = printProperty;
function printProperty()
{
var bodyElement = document.getElementsByTagName("body")[0];
var items = bodyElement.childNodes;
for(var i = 0; i < items.length; i++) {
alert(items[i].nodeName);
}
}
</script>
</head>
<body>
<p id="description">测试</p>
<ul>
<li><a href="test1.jpg">图片1</a></li>
<li><a href="test2.jpg">图片2</a></li>
<li><a href="test3.jpg">图片3</a></li>
</ul>
</body>
<html>
其实这段代码完全可以写入js文件中,例如example.js中,再使用如下语句引入:
<script type="text/javascript" src="innerHtmlExample.js">
</script>
1.10 为JS代码做过多的假设
很多JS在代码编写时,使用getElementById()方法取得某个元素后马上就对元素进行一些属性设置等操作,在这种情况下,他是做了假设的,即假设这个元素已经存在的。若这个元素不一样存在,程序员要尽量避免这种假设,而检查该元素是否存在。
例如在如下代码中,就进行了过多的假设:
function showPic(whichpic) {
var source = whichpic.getAttribute("href");
var placeholder = document.getElementById("placeholder");
placeholder.setAttribute("src", source);
var text = whichpic.getAttribute("title");
var description = document.getElementById("description");
description.firstChild.nodeValue = text;
}
可将这段代码改造成:
function showPic(whichpic) {
if (!document.getElementById("placeholder")) return false;
var source = whichpic.getAttribute("href");
var placeholder = document.getElementById("placeholder");
placeholder.setAttribute("src", source);
var text = whichpic.getAttribute("title");
if (!document.getElementById("description")) return false;
var description = document.getElementById("description");
description.firstChild.nodeValue = text;
}
1.11 使用某些浏览器的特性
2、 参考文档
(1)《JavaScript: Bad Practices》:
http://james.padolsey.com/javascript/javascript-bad-practices/
(2)《写JavaScript时要注意避免的坏习惯》:
http://hi.baidu.com/chrisyue/blog/item/ccea6060ce14cb49eaf8f867.html
(3)《JavaScript DOM编程艺术》 [英] Jeremy Keith 著,杨涛、王晓云等译,人民邮电出版社出版
------------------------------------------------------------------------------------------
转载自 阿蜜果 http://www.blogjava.net/amigoxie
分享到:
相关推荐
此外,Douglas Crockford对语言中的一些"坏部分"(如with关键字和全局变量)进行了批判,提倡使用更安全、更简洁的编程习惯。 无论是初学者还是经验丰富的开发者,这本书都能提供深刻的洞见和实用的技巧,帮助你更...
总的来说,网页编程工具的选择应根据个人习惯和项目需求来定,一个好的工具能提升编程体验,加速开发进程。Notepad++作为一个免费且强大的编辑器,是初学者和专业人士的理想选择,结合有效的学习资源和使用技巧,...
然而,随着项目规模的扩大和技术复杂性的增加,遵循良好的编程习惯变得至关重要。《JavaScript最佳实践》一书由Christian Heilmann撰写,旨在帮助开发者提高代码质量、增强可读性和可维护性,同时优化性能。以下是从...
这是为了确保您了解语言的真正重要部分并养成良好的习惯,而不必将坏习惯打乱。 这些笔记的目的是从一本本本已经很密集的书中收集出色的信息,以笔记的形式,将这些构想尽可能地翻译成“普通英语” ,并在书中假定...
《JavaScript实现LeetCode解题策略深度解析》 在编程领域,LeetCode是一个广受欢迎的在线平台,它提供了...通过深入学习和实践,你不仅可以提升JavaScript编程能力,还能增强算法思维,为未来的编程生涯打下坚实基础。
【标题】:“定位胆出次统计图例子源码”指的是一个与数据分析和可视化相关的编程示例,它可能是一个用于分析赌博...同时,如果“SanYe”是一个团队或个人,他们的编码实践也可能提供关于良好编程习惯和风格的示例。
这款编辑器支持多种编程语言,包括但不限于Python、JavaScript、HTML、CSS、C++、Java等,几乎涵盖了所有主流的编程和标记语言。 Sublime Text 3 的主要特点: 1. **多语言支持**:Sublime Text3 支持语法高亮,...
1. **编程语言基础**:实验可能涉及使用Java、Python、C++或JavaScript等编程语言。学习者应掌握基本语法、变量、控制结构(如循环和条件语句)、函数以及错误处理。 2. **数据结构**:实验可能要求实现或理解栈、...
PMD是流行的一种开源代码分析工具,主要用于检测Java、JavaScript、C#等编程语言的源代码,以便发现潜在的bug、不良编程习惯和复杂性问题。"pmd-bin-5.2.3"是一个特定版本的PMD软件包,发布于2015年。这个版本包含了...
在IT领域,按钮响应问题通常指的是用户在网页或应用程序中点击按钮时,预期的操作没有立即或者正确地执行。...在实际工作中,良好的编程习惯、充分的测试和适当的性能优化都是防止此类问题的关键。
Android浏览器设计与实现是移动互联网时代的热门话题,随着3G网络和移动通信技术的快速发展,智能手机正在成为移动互联网发展的强大动力,用户利用智能手机通过浏览器访问网络己经成为生活习惯,浏览器己经成为智能...
- **多种编程语言支持**:SonarLint不仅支持Java,还涵盖C#、JavaScript、Python、Go等众多编程语言,确保跨语言项目的质量。 - **规则定制**:用户可以根据项目需求,选择启用或禁用特定的规则,甚至自定义新的...
希尔排序的时间复杂度在最坏情况下为O(n^2),但在实际应用中,由于其分组和插入排序的特性,通常表现得比简单插入排序快很多。 在易语言中实现希尔排序,我们需要理解易语言的基本语法和数据结构。易语言是一种中国...
它支持多种编程语言的语法高亮显示,如HTML、CSS、JavaScript、Python、Java等,使代码更易于阅读和理解。此外,自定义颜色主题和字体设置允许用户根据个人偏好调整工作环境,提高编程效率。 其次,EmEditor提供了...
SonarQube 是一款强大的静态代码分析和持续代码审查平台,它能检测出代码中的潜在问题,如漏洞、坏味道(不良编程习惯)和复杂性等。SonarQube 支持多种编程语言,包括 Java、Python、C#、JavaScript 等。它提供了...
《清洁代码-rg》是关于软件开发中代码质量和可维护性的深入探讨,尤其针对JavaScript编程语言。本资源可能包括了作者对于如何编写清晰、高效、易于理解和维护的代码的见解和实践指南。从标题和描述来看,我们似乎...
IDEA(IntelliJ IDEA)是一款广受欢迎的Java集成开发环境,而PMD是著名的静态代码分析工具,用于检测代码中的潜在问题、坏味道和编程错误。PMD插件将这两者结合,使得开发者在IDEA中可以直接使用PMD的功能,提高代码...
19. **JavaScript**:JavaScript是一种轻量级的解释型编程语言,主要用来增强网页的交互性和动态功能,如表单验证、页面动画、数据处理、Ajax异步通信等。 以上知识点涵盖了计算机二级等级考试中涉及的数据库操作、...
首先,我们需要知道的是,大多数编程语言都提供了对鼠标事件的支持,例如JavaScript、Python、C#等。这些语言的库或API允许我们监听鼠标的位置变化,包括点击、移动、滚动等事件。 1. **监听鼠标事件**: - 在...