首页 > JavaScript > JavaScript 让人郁闷的东西
2009十月13

JavaScript 让人郁闷的东西

先声明一下,这篇日志算是半个抄袭吧。因为,是我看完《JavaScript 权威指南 精华本》根据作者提到的“JavaScript 糟粕”决定有必要抄一下,让大家注意一下,毕竟细节决定成败。

不得不承认,JavaScript 是一个让人又爱又恨的程序语言。优点自不必说,可是一些缺点,如果您讳疾忌医的话而不去了解,有时一个错误会让您苦苦思索一整天,而真正的原因却不在您,而是 JavaScript 本身的设计导致的,这就太冤枉了不是?

让人吐血的全局变量:

在说这个让人吐血的原因之前,我们先来了解一下 JavaScript变量的一些基础知识。

在JavaScript 程序中,在使用一个变量之前,必须先声明它,如果你没有地声明一个变量,JavaScript会替你隐式地声明它。

变量是使用关键字 var 声明的。

使用var语句多次声明同一个变量 不仅是合法的,而且也不会造成任何错误。如果其有初始值,则再次声明只是起到赋值的作用。

变量是有作用域的,其作用域是程序中定义这个变量的区域。全局变量的作用域是全局的。

在函数之内声明的变量,只在函数体内有定义,是局部变量,使用域只在函数中有效。函数的参数也是局部变量,只在函数体内有定义。

函数体内,局部变量的优先级要比同名的全局变量高。如果一个局部变量 数年参数声明与某个全爆开的名字相同,那么就会有效地隐藏这个全局变量。

上面的内容有些多,不过大家别急,真正的BOSS要出场了。

在全局作用域中编写代码时可以不使用var语句,但是如果您在声明局部变量的时候,一定要记得使用var,因为这往往就是错误之源。

var x = 3;  //定义全局变量x
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 host = 'xiaoxiaozi'

var author = 'simaopig'

上面的语句是没有问题的,和您自己加分号是一样的。

下面大家再来看下面的例子:

return
{
    host:xiaoxiaozi;

};

结果不会是您想要的。因为return在 JavaScript里面是一条完整的语句。JavaScript自做聪明的为您加了一个分号,其真正意义变为了如下语句:

return ;
{
    host:xiaoxiaozi;

};

所以我们要有一个好的编程习惯,自己加分号,不能相信JavaScript帮您加的,那会引起莫名其妙的问题。

好的习惯就是我们把大括号的左半部分,写在 return 同行。例如下面的写法

return {
    host:xiaoxiaozi;

};

总结及唠叨:

找bug是一个让人头痛的事,如果我们从小处着手,在写程序的时候注意这些细节,才能从根本上拯救我们不多的头发(程序员容易掉头发)。

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/10/13/1528/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

19 Responses to “JavaScript 让人郁闷的东西”

  1. #1 sleepy 回复 | 引用 Post:2009-10-14 08:45

    还好我总是用var来申明变量并总是自己加上;号来结尾的

    [回复]

  2. #2 alswl 回复 | 引用 Post:2009-10-14 09:07

    请问你是前端设计师么?

    [回复]

  3. #3 要饭的 回复 | 引用 Post:2009-10-14 09:38

    学问
    基本不会用js

    [回复]

  4. #4 simaopig 回复 | 引用 Post:2009-10-14 10:05

    @sleepy
    呵,这是一个好习惯。

    [回复]

  5. #5 simaopig 回复 | 引用 Post:2009-10-14 10:06

    @alswl
    小半个吧,不会CSS。。

    经常前后台一起写。嗯。

    [回复]

  6. #6 simaopig 回复 | 引用 Post:2009-10-14 10:07

    @要饭的
    没事,“要好饭”照样当皇帝——朱元璋。呵。

    [回复]

  7. #7 华晨 回复 | 引用 Post:2009-10-14 12:57

    @simaopig
    岂有会js不会css的道理,我js一点不会。

    [回复]

  8. #8 simaopig 回复 | 引用 Post:2009-10-14 12:58

    @华晨
    我会,会那点东西不好干啥啊。

    只是用JS改点样式啥的。自己独立写CSS可就愁死人了。呵。

    [回复]

  9. #9 Showfom 回复 | 引用 Post:2009-10-14 16:48

    话说,最近在忙啥呢

    [回复]

  10. #10 simaopig 回复 | 引用 Post:2009-10-14 16:53

    @Showfom
    就是充值,游戏,系统监控这些。。

    [回复]

  11. #11 Showfom 回复 | 引用 Post:2009-10-14 16:54

    @simaopig
    赶紧抽出空来,bit.ly已经死了,我们可以干一场了。

    [回复]

  12. #12 simaopig 回复 | 引用 Post:2009-10-14 16:55

    @Showfom
    死啦?我去看一下先。。我倒是想抽出空来。

    每天工作完了就是柴米油盐,哪得这“空”去啊。

    [回复]

  13. #13 Showfom 回复 | 引用 Post:2009-10-14 17:02

    @simaopig
    话说我手机号码换了 你邮箱多少 我发给你一下

    [回复]

  14. #14 simaopig 回复 | 引用 Post:2009-10-14 17:07
  15. #15 Lxhome 回复 | 引用 Post:2009-10-15 15:25

    没技术的捧个人场!

    [回复]

  16. #16 bolo 回复 | 引用 Post:2009-10-15 16:14

    有钱我也弄本书学学JavaScript

    [回复]

  17. #17 风也飘泊 回复 | 引用 Post:2009-10-15 21:23

    小小子嘿细心呀,JS的我看得懂

    对于那个m的问题,真是好奇怪…我学AS3的时候这样写也是错误的,没想到JS中居然会是对的

    [回复]

  18. #18 weiking 回复 | 引用 Post:2009-10-16 13:37

    确实,代码一定要规范些,不然,自己遭罪,其他人更遭罪~

    [回复]

  19. #19 CheonNii 回复 | 引用 Post:2009-10-22 00:48

    我个人觉得自己还是有比较好的习惯。
    分号都是自己加,代码结构都是
    function (obj) {
    if(obj) {
    document.write(‘小小子’);
    }
    return false;
    }
    写分号有个好处就是净化(压缩)的时候不会出错。

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)