首页 > JS&HTML > JavaScript 让人郁闷的东西

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

  1. sleepy 十 14th, 2009 @ 08:45 | #1

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

  2. alswl 十 14th, 2009 @ 09:07 | #2

    请问你是前端设计师么?

  3. 要饭的 十 14th, 2009 @ 09:38 | #3

    学问
    基本不会用js

  4. simaopig 十 14th, 2009 @ 10:05 | #4

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

  5. simaopig 十 14th, 2009 @ 10:06 | #5

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

    经常前后台一起写。嗯。

  6. simaopig 十 14th, 2009 @ 10:07 | #6

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

  7. 华晨 十 14th, 2009 @ 12:57 | #7

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

  8. simaopig 十 14th, 2009 @ 12:58 | #8

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

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

  9. Showfom 十 14th, 2009 @ 16:48 | #9

    话说,最近在忙啥呢

  10. simaopig 十 14th, 2009 @ 16:53 | #10

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

  11. Showfom 十 14th, 2009 @ 16:54 | #11

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

  12. simaopig 十 14th, 2009 @ 16:55 | #12

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

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

  13. Showfom 十 14th, 2009 @ 17:02 | #13

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

  14. Lxhome 十 15th, 2009 @ 15:25 | #15

    没技术的捧个人场!

  15. bolo 十 15th, 2009 @ 16:14 | #16

    有钱我也弄本书学学JavaScript

  16. 风也飘泊 十 15th, 2009 @ 21:23 | #17

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

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

  17. weiking 十 16th, 2009 @ 13:37 | #18

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

  18. CheonNii 十 22nd, 2009 @ 00:48 | #19

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

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks