JavaScript 让人郁闷的东西
先声明一下,这篇日志算是半个抄袭吧。因为,是我看完《JavaScript 权威指南 精华本》根据作者提到的“JavaScript 糟粕”决定有必要抄一下,让大家注意一下,毕竟细节决定成败。
不得不承认,JavaScript 是一个让人又爱又恨的程序语言。优点自不必说,可是一些缺点,如果您讳疾忌医的话而不去了解,有时一个错误会让您苦苦思索一整天,而真正的原因却不在您,而是 JavaScript 本身的设计导致的,这就太冤枉了不是?
让人吐血的全局变量:
在说这个让人吐血的原因之前,我们先来了解一下 JavaScript变量的一些基础知识。
在JavaScript 程序中,在使用一个变量之前,必须先声明它,如果你没有地声明一个变量,JavaScript会替你隐式地声明它。
变量是使用关键字 var 声明的。
使用var语句多次声明同一个变量 不仅是合法的,而且也不会造成任何错误。如果其有初始值,则再次声明只是起到赋值的作用。
变量是有作用域的,其作用域是程序中定义这个变量的区域。全局变量的作用域是全局的。
在函数之内声明的变量,只在函数体内有定义,是局部变量,使用域只在函数中有效。函数的参数也是局部变量,只在函数体内有定义。
函数体内,局部变量的优先级要比同名的全局变量高。如果一个局部变量 数年参数声明与某个全爆开的名字相同,那么就会有效地隐藏这个全局变量。
上面的内容有些多,不过大家别急,真正的BOSS要出场了。
在全局作用域中编写代码时可以不使用var语句,但是如果您在声明局部变量的时候,一定要记得使用var,因为这往往就是错误之源。
var y = 0; //定义全局变量y
function demo()
{
x++; //改变全局变量x的值
window.x++; //改变全局变量x的值
y = 'abc';
var z = 'zzz'; //z是私有变量
m = 'm'; //m是被隐式声明的全局变量
}
demo();
alert(typeof(z)); //z不存在,所以弹出是undefined
alert("x:"+x+" y:"+y+" m:"+m);
此例中,我们可以看到全局变量x的值最后被改变为5,全局变量y的值被改变为abc,而m在函数中使用,但是其创建的时候没有使用var语句,但是使用的之前没有定义,JS隐式的声明其为全局变量,这时如果您在外面定义一个var m;那么这个变量其实已经是有值的了。
刚刚接触到编程的孩子可能很奇怪(一般都是通过C入门的大学生),为什么在{}里面的变量居然可以是全局变量?这显然是不应该的。
原因就是JavaScript并没有像C语言一样的块作用域。
这里有位仁兄的例子很能说明问题,大家可以去观摩——作用域的一些问题。
自动插入分号:
JavaScript 和PHP一样都采用分号作为语句结束的标识。主要作用就是为了分隔语句,如果语句分别旋转在不同的行中,就可以省略分号,因为JavaScript很聪明,会为您在语句结束后自动加入分号。
var author = 'simaopig'
上面的语句是没有问题的,和您自己加分号是一样的。
下面大家再来看下面的例子:
{
host:xiaoxiaozi;
};
结果不会是您想要的。因为return在 JavaScript里面是一条完整的语句。JavaScript自做聪明的为您加了一个分号,其真正意义变为了如下语句:
{
host:xiaoxiaozi;
};
所以我们要有一个好的编程习惯,自己加分号,不能相信JavaScript帮您加的,那会引起莫名其妙的问题。
好的习惯就是我们把大括号的左半部分,写在 return 同行。例如下面的写法
host:xiaoxiaozi;
};
总结及唠叨:
找bug是一个让人头痛的事,如果我们从小处着手,在写程序的时候注意这些细节,才能从根本上拯救我们不多的头发(程序员容易掉头发)。
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/10/13/1528/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
还好我总是用var来申明变量并总是自己加上;号来结尾的
[回复]
请问你是前端设计师么?
[回复]
学问
基本不会用js
[回复]
@sleepy
呵,这是一个好习惯。
[回复]
@alswl
小半个吧,不会CSS。。
经常前后台一起写。嗯。
[回复]
@要饭的
没事,“要好饭”照样当皇帝——朱元璋。呵。
[回复]
@simaopig
岂有会js不会css的道理,我js一点不会。
[回复]
@华晨
我会,会那点东西不好干啥啊。
只是用JS改点样式啥的。自己独立写CSS可就愁死人了。呵。
[回复]
话说,最近在忙啥呢
[回复]
@Showfom
就是充值,游戏,系统监控这些。。
[回复]
@simaopig
赶紧抽出空来,bit.ly已经死了,我们可以干一场了。
[回复]
@Showfom
死啦?我去看一下先。。我倒是想抽出空来。
每天工作完了就是柴米油盐,哪得这“空”去啊。
[回复]
@simaopig
话说我手机号码换了 你邮箱多少 我发给你一下
[回复]
@Showfom
simaopig@xiaoxiaozi.com
[回复]
没技术的捧个人场!
[回复]
有钱我也弄本书学学JavaScript
[回复]
小小子嘿细心呀,JS的我看得懂
对于那个m的问题,真是好奇怪…我学AS3的时候这样写也是错误的,没想到JS中居然会是对的
[回复]
确实,代码一定要规范些,不然,自己遭罪,其他人更遭罪~
[回复]
我个人觉得自己还是有比较好的习惯。
分号都是自己加,代码结构都是
function (obj) {
if(obj) {
document.write(‘小小子’);
}
return false;
}
写分号有个好处就是净化(压缩)的时候不会出错。
[回复]