JavaScript初学者应注意的七个细节详细介绍


Posted in Javascript onDecember 27, 2012

种种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的。本文利列举了JavaScript初学者应该注意的七个细节,与大家分享。
(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返回的一种格式,在许多的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对标准的支持是最差的。最终用户看到的结果也许就是,你写的代码在某个浏览器无法正确运行。你应该把你的代码在主流的浏览器中都测试一下,这也许很费时间,但是应该这样做。
Javascript 相关文章推荐
Ruffy javascript 学习笔记
Nov 30 Javascript
使用js画图之画切线
Jan 12 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
JavaScript数组去重的3种方法和代码实例
Jul 01 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
D3.js实现柱状图的方法详解
Sep 21 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
layer更改皮肤的实现方法
Sep 11 Javascript
关于vue 结合原生js 解决echarts resize问题
Jul 26 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
Dec 27 #Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 #Javascript
关于火狐(firefox)及ie下event获取的两种方法
Dec 27 #Javascript
Javascript图像处理—为矩阵添加常用方法
Dec 27 #Javascript
ie支持function.bind()方法实现代码
Dec 27 #Javascript
前后台交互过程中json格式如何解析以及如何生成
Dec 26 #Javascript
多个js与css文件的合并方法详细说明
Dec 26 #Javascript
You might like
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
php实现mysql封装类示例
2014/05/07 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
简单的自定义php模板引擎
2016/08/26 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
React实现全选功能
2020/08/25 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python实现TCP文件传输
2020/03/20 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
项目合作计划书
2014/01/09 职场文书
小学安全教育材料
2014/02/17 职场文书