javascript代码编写需要注意的7个小细节小结


Posted in Javascript onSeptember 21, 2011

1. 简化代码
JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的:

<SPAN style="FONT-FAMILY: verdana, geneva">var car = new Object(); 
car.colour = 'red'; 
car.wheels = 4; 
car.hubcaps = 'spinning'; 
car.age = 4; 
</SPAN>

下面的写法可以达到同样的效果:
<SPAN style="FONT-FAMILY: verdana, geneva">var car = { 
colour:'red', 
wheels:4, 
hubcaps:'spinning', 

age:4 
} 
</SPAN>

后面的写法要短得多,而且你不需要重复写对象名称。
另外对于数组同样有简洁的写法,过去我们声明数组是这样写的:
<SPAN style="FONT-FAMILY: verdana, geneva">var moviesThatNeedBetterWriters = new Array( 
'Transformers','Transformers2','Avatar','Indiana Jones 4' 
); 
</SPAN>

更简洁的写法是:
<SPAN style="FONT-FAMILY: verdana, geneva">var moviesThatNeedBetterWriters = [ 
'Transformers','Transformers2','Avatar','Indiana Jones 4' 
]; 
</SPAN>

对于数组,还有关联数组这样一个特别的东西。 你会发现很多代码是这样定义对象的:
<SPAN style="FONT-FAMILY: verdana, geneva">var car = new Array(); 
car['colour'] = 'red'; 
car['wheels'] = 4; 
car['hubcaps'] = 'spinning'; 
car['age'] = 4; 
</SPAN>

这太疯狂了,不要觉得困惑,“关联数组”只是对象的一个别名而已。
另外一个简化代码的方法是使用三元运算符,举个例子:
<SPAN style="FONT-FAMILY: verdana, geneva">var direction; 
if(x < 200){ 
direction = 1; 
} else { 
direction = -1; 
} 
</SPAN>

我们可以使用如下的代码替换这种写法:
<SPAN style="FONT-FAMILY: verdana, geneva">var direction = x < 200 ? 1 : -1; 
</SPAN>

2. 使用JSON作为数据格式
伟大的Douglas Crockford发明了JSON数据格式来存储数据,你可以使用原生的javascript方法来存储复杂的数据而不需要进行任何额外的转换,例如:
<SPAN style="FONT-FAMILY: verdana, geneva">var band = { 
"name":"The Red Hot Chili Peppers", 
"members":[ 
{ 
"name":"Anthony Kiedis", 
"role":"lead vocals" 
}, 
{ 
"name":"Michael 'Flea' Balzary", 
"role":"bass guitar, trumpet, backing vocals" 
}, 
{ 
"name":"Chad Smith", 
"role":"drums,percussion" 
}, 
{ 
"name":"John Frusciante", 
"role":"Lead Guitar" 
} 
], 
"year":"2009" 
} 
</SPAN>

你可以使用在JavaScript中直接使用JSON,甚至作为API返回的一种格式,在许多的API中被应用,例如:
<SPAN style="FONT-FAMILY: verdana, geneva"><div id="delicious"></div><script> 
function delicious(o){ 
var out = '<ul>'; 
for(var i=0;i<o.length;i++){ 
out += '<li><a href="' + o[i].u + '">' + 
o[i].d + '</a></li>'; 
} 
out += '</ul>'; 
document.getElementById('delicious').innerHTML = out; 
} 
</script> 
<script src="http://feeds.delicious.com/v2/json/codepo8/javascript?count=15&callback=delicious"></script> 
</SPAN>

这里调用delicious 的Web服务获取最新书签,以JSON格式返回,然后将它们显示成无序列表的形式。
从本质上讲,JSON是用于描述复杂的数据最轻量级的方式,而且直接它运行在浏览器中。 你甚至可以在PHP中调用 json_decode()函数来使用它。
3. 尽量使用javascript原生函数
要找一组数字中的最大数,我们可能会写一个循环,例如:
<SPAN style="FONT-FAMILY: verdana, geneva">var numbers = [3,342,23,22,124]; 
var max = 0; 
for(var i=0;i<numbers.length;i++){ 
if(numbers[i] > max){ 
max = numbers[i]; 
} 
} 
alert(max); 
</SPAN>

其实,不用循环可以实现同样的功能:
<SPAN style="FONT-FAMILY: verdana, geneva">var numbers = [3,342,23,22,124]; 
numbers.sort(function(a,b){return b - a}); 
alert(numbers[0]); 
</SPAN>

而最简洁的写法是:
<SPAN style="FONT-FAMILY: verdana, geneva">Math.max(12,123,3,2,433,4); // returns 433 
</SPAN>

你甚至可以使用Math.max来检测浏览器支持哪个属性:
<SPAN style="FONT-FAMILY: verdana, geneva">var scrollTop= Math.max( 
doc.documentElement.scrollTop, 
doc.body.scrollTop 
); 
</SPAN>

如果你想给一个元素增加class样式,可能原始的写法是这样的:
<SPAN style="FONT-FAMILY: verdana, geneva">function addclass(elm,newclass){ 
var c = elm.className; 
elm.className = (c === '') ? newclass : c+' '+newclass; 
} 
</SPAN>

而更优雅的写法是:
<SPAN style="FONT-FAMILY: verdana, geneva">function addclass(elm,newclass){ 
var classes = elm.className.split(' '); 
classes.push(newclass); 
elm.className = classes.join(' '); 
} 
</SPAN>

4. 事件委托
事件是JavaScript非常重要的一部分。我们想给一个列表中的链接绑定点击事件,一般的做法是写一个循环,给每个链接对象绑定事件,HTML代码如下:
<SPAN style="FONT-FAMILY: verdana, geneva"><h2>Great Web resources</h2> 
<ul id="resources"> 
<li><a href="http://opera.com/wsc">Opera Web Standards Curriculum</a></li> 
<li><a href="http://sitepoint.com">Sitepoint</a></li> 
<li><a href="http://alistapart.com">A List Apart</a></li> 
<li><a href="http://yuiblog.com">YUI Blog</a></li> 
<li><a href="http://blameitonthevoices.com">Blame it on the voices</a></li> 
<li><a href="http://oddlyspecific.com">Oddly specific</a></li> 
</ul> 
</SPAN>

脚本如下:
<SPAN style="FONT-FAMILY: verdana, geneva">// Classic event handling example 
(function(){ 
var resources = document.getElementById('resources'); 
var links = resources.getElementsByTagName('a'); 
var all = links.length; 
for(var i=0;i<all;i++){ 
// Attach a listener to each link 
links[i].addEventListener('click',handler,false); 
}; 
function handler(e){ 
var x = e.target; // Get the link that was clicked 
alert(x); 
e.preventDefault(); 
}; 
})(); 
</SPAN>

更合理的写法是只给列表的父对象绑定事件,代码如下:
<SPAN style="FONT-FAMILY: verdana, geneva">(function(){ 
var resources = document.getElementById('resources'); 
resources.addEventListener('click',handler,false); 
function handler(e){ 
var x = e.target; // get the link tha 
if(x.nodeName.toLowerCase() === 'a'){ 
alert('Event delegation:' + x); 
e.preventDefault(); 
} 
}; 
})(); 
</SPAN>

5. 匿名函数
关于JavaScript的最头疼的事情之一是,它的变量没有特定的作用范围。 一般情况下,任何变量,函数,数组或对象都是全局性,这意味着在同一页上的其他脚本可以访问并覆盖它们。解决方法是把变量封装在一个匿名函数中。 例如,下面的定义将产生三个全局变量和和两个全局函数:
<SPAN style="FONT-FAMILY: verdana, geneva">var name = 'Chris'; 
var age = '34'; 
var status = 'single'; 
function createMember(){ 
// [...] 
} 
function getMemberDetails(){ 
// [...] 
} 
</SPAN>

封装后如下:
<SPAN style="FONT-FAMILY: verdana, geneva">var myApplication = function(){ 
var name = 'Chris'; 
var age = '34'; 
var status = 'single'; 
return{ 
createMember:function(){ 
// [...] 
}, 
getMemberDetails:function(){ 
// [...] 
} 
} 
}(); 
// myApplication.createMember() and 
// myApplication.getMemberDetails() now works. 
</SPAN>

这被称为单体模式,是JavaScript设计模式的一种,这种模式在YUI中用得非常多,改进的写法是:
<SPAN style="FONT-FAMILY: verdana, geneva">var myApplication = function(){ 
var name = 'Chris'; 
var age = '34'; 
var status = 'single'; 
function createMember(){ 
// [...] 
} 
function getMemberDetails(){ 
// [...] 
} 
return{ 
create:createMember, 
get:getMemberDetails 
} 
}(); 
//myApplication.get() and myApplication.create() now work. 
</SPAN>

6. 代码可配置
你写的代码如果想让别人更容易进行使用或者修改,则需要可配置,解决方案是在你写的脚本中增加一个配置对象。要点如下:
1、在你的脚本中新增一个叫configuration的对象。
2、在配置对象中存放所有其它人可能想要去改变的东西,例如CSS的ID、class名称、语言等等。
3、返回这个对象,作为公共属性以便其它人可以进行重写。
7. 代码兼容性
兼容性是初学者容易忽略的部分,通常学习Javascript的时候都是在某个固定的浏览器中进行测试,而这个浏览器很有可能就是IE,这是非常致命的,因为目前几大主流浏览器中偏偏IE对标准的支持是最差的。最终用户看到的结果也许就是,你写的代码在某个浏览器无法正确运行。你应该把你的代码在主流的浏览器中都测试一下,这也许很费时间,但是应该这样做。
Javascript 相关文章推荐
jquery中加载图片自适应大小主要实现代码
Aug 23 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
js动态往表格的td中添加图片并注册事件
Jun 12 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
Feb 17 Javascript
JavaScript中的toUTCString()方法使用详解
Jun 12 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
jquery uploadify隐藏上传进度的实现方法
Feb 06 Javascript
微信小程序 设置启动页面的两种方法
Mar 09 Javascript
原生js实现仿window10系统日历效果的实例
Oct 31 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
vue 实现强制类型转换 数字类型转为字符串
Nov 07 Javascript
extjs 初始化checkboxgroup值的代码
Sep 21 #Javascript
基于jquery的一个拖拽到指定区域内的效果
Sep 21 #Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 #Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 #Javascript
Dom操作之兼容技巧分享
Sep 20 #Javascript
js获取图片大小的函数代码
Sep 20 #Javascript
javascript中的注释使用与注意事项小结
Sep 20 #Javascript
You might like
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
Yii配置文件用法详解
2014/12/04 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
jquery为页面增加快捷键示例
2014/01/31 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
jQuery中closest()函数用法实例
2015/01/07 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
react-router实现按需加载
2017/05/09 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
js实现弹幕墙效果
2020/12/10 Javascript
Python实现简单截取中文字符串的方法
2015/06/15 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
新娘父亲婚礼致辞
2014/01/16 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书