假设页面如下: <BODY>
  <INPUT TYPE="text" id="aa" NAME="" value="aaaa">
 </BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
alert(aa.value);
//var aa = 'abc';
//alert(aa);
//-->
</SCRIPT>我有两个问题:
1.为什么JS的第一句可以直接使用aa?
2.如果把JS中那两行注释去掉,第一句运行就会报错。这是为什么?难道JS不是解释型的么?

解决方案 »

  1.   

    你写的不规范:
    try:<BODY>
      <INPUT TYPE="text" id="aa" name="aa" value="aaaa">
    </BODY>
    <SCRIPT type="text/javascript">
    <!--
    alert(document.getElementById('aa'));
    var aa = 'abc';
    alert(aa);
    //-->
    </SCRIPT> 
      

  2.   


    其实我的问题是,定义了一个id='aa'的元素,可以在js里直接访问,不需要通过document.getElementById。那么这个aa的变量是谁在什么时候定义好的呢?
    然后,为什么后面我使用var aa来定义之后,会导致前面那句又不可以用了呢?
      

  3.   


    CSDN的早期注册的,当时想也没想就用了中文了。
      

  4.   

    可以在js里直接访问,不需要通过document.getElementById
    re:
    这种想法就是错的!在IE的早期或许好用.那么这个aa的变量是谁在什么时候定义好的呢?
    re:
    你是说这样么?
    var aa=document.getElementById('aa');
      

  5.   

    我是在IE7下运行的,算不算早期?第二个问题,没有你这句var ,也能直接用aa,问题就是这是谁在什么时候给定义好的呢?
      

  6.   

    我又在google chrome里运行了一下,两种情况都没有报错。呵呵,真有趣。
      

  7.   

    JS是按块解析运行的,在解析的时候,var 会被先解析, 相当于:
    var aa;
    alert(aa.value);
    aa = 'abc';
    alert(aa);在执行alert(aa.value)时候,aa.value的值就是undefined
    你把它拆成2断就不会这样<script>
    alert(aa.value);
    </script>
    <script>
    var aa = "abc";
    alert(aa);
    </script>
      

  8.   

    更正:
    在执行alert(aa.value)时候,aa的值就是undefined, 调用aa.value就会报错
      

  9.   

    按你说的,一个块里的变量如果没有事先var,那么会先进行var解析,其结果是undefined,那么为什么这个aa却能直接使用到aa.value呢?
      

  10.   

    把你的全HTML贴出来看看.以下是我的<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <BODY>
      <INPUT TYPE="text" id="aa" NAME="" value="aaaa"> 
    </BODY>
    <SCRIPT type="text/javascript">
    <!--
    alert(aa.value);
    var aa = 'abc';
    alert(aa);
    //-->
    </SCRIPT> </html>我的w2k3 sp2 ie7是报错的!看IBM
    http://www.ibm.com/developerworks/web/library/wa-e4js/index.html
    MSDN
    http://msdn.microsoft.com/en-us/library/ms535126%28VS.85%29.aspx
    注意这时html的doctype在这要起作用!
      

  11.   

    OK,全部代码是这样的。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <BODY>
      <INPUT TYPE="text" id="aa" NAME="aa" value="aaaa"> 
    </BODY>
    <SCRIPT type="text/javascript">
    <!--
    alert(aa.value);
    var aa = 'abc';
    alert(aa);
    //-->
    </SCRIPT> </html>以上代码在WinXP SP3 IE7下运行的,结果是第一个alert就报错,说aa.value为空或不是对象。
    其实是aa为空或不是对象,你可以把第一句改成alert(typeof(aa))可以输出undefined。问题来了,如果没有2 3两句,第一个alert是没有问题的。
    为什么后面的var 会导致它出错?
    按11楼的解释,第一个alert的aa还没有"显式"地var过,那会隐式的var一次,可如果没有2 3两句,却是可以运行的。这个解释我认为不通。
    14楼的第一个链接看起来挺有道理的。但后面的var aa会导致之前的alert有错,这个还是没想明白。
      

  12.   

    我倒!你不是说不报错么?你用的是HTML 4.0的文档类型.只留第一行是不报错.你看mozilla给的提示:
    Element referenced by ID/NAME in the global scope. Use W3C standard document.getElementById() instead.
    [Break on this error] alert(aa.value); 
      

  13.   

    晕我说的是var定义被会先解析。并没说会隐式的var一次
      

  14.   


    <input id="aa" value="123" />
    <script>
    alert(aa.value);   // 这里当然没有问题.因为 aa 就是那个 input, input 有value. 没有错
    </script>
    <input id="aa" value="123" />
    <script>
    var aa;
    alert(aa.value);   // 这就不行了, 你 var 了一个 aa, 外面的那个 input 就被隐藏啦.
    </script><input id="aa" value="123" />
    <script>
    alert(aa.value);   // 即使先 alert, 再 var , 也不行!  因为 jscript 解释时,把声明提到了 块首
    var aa;
    </script>----------------------------------------------------------------------
    像下面这样的脚本var a = 1;
    var b = 2;
    var c = 3;
    var d = 4;
    var e = 5;
    // ...解释执行时,相当于var a, b, c, d, e; // ...   声明,都被提到前面来
    a = 1;
    b = 2;
    c = 3;
    d = 4;
    e = 5;
    // ...
      

  15.   

    IE中jscript引擎的解析顺序造成的问题. alert(aa.value);  这个不是标准的写法. 一般表示ID为aa的节点的value.var aa = "123", 引擎先看到的是声明. 但是alert(aa.value)的时候还没有被赋值.