先声明一下,这篇日志算是半个抄袭吧。因为,是我看完《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是一个让人头痛的事,如果我们从小处着手,在写程序的时候注意这些细节,才能从根本上拯救我们不多的头发(程序员容易掉头发)。
还好我总是用var来申明变量并总是自己加上;号来结尾的