奉献给JavaScript初学者的编写开发的七个细节


Posted in Javascript onJanuary 11, 2011

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

var car = new Object(); 
car.colour = 'red'; 
car.wheels = 4; 
car.hubcaps = 'spinning'; 
car.age = 4;

下面的写法可以达到同样的效果:
var car = { 
colour:'red', 
wheels:4, 
hubcaps:'spinning', 

age:4 
}

后面的写法要短得多,而且你不需要重复写对象名称。

另外对于数组同样有简洁的写法,过去我们声明数组是这样写的:

var moviesThatNeedBetterWriters = new Array( 
'Transformers','Transformers2','Avatar','Indiana Jones 4' 
);

更简洁的写法是:
var moviesThatNeedBetterWriters = [ 
'Transformers','Transformers2','Avatar','Indiana Jones 4' 
];

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

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

我们可以使用如下的代码替换这种写法:
var direction = x < 200 ? 1 : -1;

(2)使用JSON作为数据格式

伟大的Douglas Crockford发明了JSON数据格式来存储数据,你可以使用原生的javascript方法来存储复杂的数据而不需要进行任何额外的转换,例如:
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" 
}

你可以使用在JavaScript中直接使用JSON,甚至作为API返回的一种格式,这就是所谓的JSON ? P,在许多的API中被应用,例如:
<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>

这里调用delicious 的Web服务获取最新书签,以JSON格式返回,然后将它们显示成无序列表的形式。
从本质上讲,JSON是用于描述复杂的数据最轻量级的方式,而且直接它运行在浏览器中。 你甚至可以在PHP中调用 json_decode()函数来使用它。
(3)尽量使用JavaScript原生函数
要找一组数字中的最大数,我们可能会写一个循环,例如:
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);

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

而最简洁的写法是:
Math.max(12,123,3,2,433,4); // returns 433

你甚至可以使用Math.max来检测浏览器支持哪个属性:
var scrollTop= Math.max( 
doc.documentElement.scrollTop, 
doc.body.scrollTop 
);

如果你想给一个元素增加class样式,可能原始的写法是这样的:
function addclass(elm,newclass){ 
var c = elm.className; 
elm.className = (c === '') ? newclass : c+' '+newclass;

而更优雅的写法是:
function addclass(elm,newclass){ 
var classes = elm.className.split(' '); 
classes.push(newclass); 
elm.className = classes.join(' '); 
}

(4)事件委托
事件是JavaScript非常重要的一部分。我们想给一个列表中的链接绑定点击事件,一般的做法是写一个循环,给每个链接对象绑定事件,HTML代码如下:
<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>

脚本如下:
// 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(); 
}; 
})();

更合理的写法是只给列表的父对象绑定事件,这样可行的原理在于事件是支持冒泡的,代码如下:
(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(); 
} 
}; 
})();

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

封装后如下:
var myApplication = function(){ 
var name = 'Chris'; 
var age = '34'; 
var status = 'single'; 
return{ 
createMember:function(){ 
// [...] 
}, 
getMemberDetails:function(){ 
// [...] 
} 
} 
}(); 
// myApplication.createMember() and 
// myApplication.getMemberDetails() now works.

这被称为单体模式,是JavaScript设计模式的一种,这种模式在YUI中用得非常多,改进的写法是:
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.

(6)代码可配置 你写的代码如果想让别人更容易进行使用或者修改,则需要可配置,解决方案是在你写的脚本中增加一个配置对象。要点如下:
1、在你的脚本中新增一个叫configuration的对象。
2、在配置对象中存放所有其它人可能想要去改变的东西,例如CSS的ID、class名称、语言等等。
3、返回这个对象,作为公共属性以便其它人可以进行重写。

(7)代码兼容性

兼容性是初学者容易忽略的部分,通常学习Javascript的时候都是在某个固定的浏览器中进行测试,而这个浏览器很有可能就是IE,这是非常致命的,因为目前几大主流浏览器中偏偏IE对标准的支持是最差的。最终用户看到的结果也许就是,你写的代码在某个浏览器无法正确运行。你应该把你的代码在主流的浏览器中都测试一下,这也许很费时间,但是应该这样做。
原文来自:Seven JavaScript Things I Wish I Knew Much Earlier In My Career)

Javascript 相关文章推荐
用jquery ajax获取网站Alexa排名的代码
Dec 12 Javascript
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Jul 21 Javascript
JavaScript中的toDateString()方法使用详解
Jun 12 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
Jun 30 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 Javascript
Vue.js一个文件对应一个组件实践
Oct 27 Javascript
AngularJS的ng Http Request与response格式转换方法
Nov 07 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
Apr 11 Javascript
基于vue展开收起动画的示例代码
Jul 05 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
Apr 28 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 Javascript
从盛大通行证上摘下来的身份证验证js代码
Jan 11 #Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 #Javascript
javascript获取当前日期时间及其它操作函数
Jan 11 #Javascript
JavaScript中URL编码函数代码
Jan 11 #Javascript
Jquery跨域获得Json时invalid label错误的解决办法
Jan 11 #Javascript
JS无限树状列表实现代码
Jan 11 #Javascript
jQuery UI的Dialog无法提交问题的解决方法
Jan 11 #Javascript
You might like
怎样辨别一杯好咖啡
2021/03/03 新手入门
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
js+canvas实现验证码功能
2020/09/21 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Vue 数据响应式相关总结
2021/01/28 Vue.js
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python字典基本操作实例分析
2015/07/11 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
怎样填写就业意向
2014/04/02 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书