控件ID在Javascript中的问题

一脚滑倒 2010-02-06 11:00:01
假设页面如下:

<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不是解释型的么?
...全文
216 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengtan1021 2010-02-08
  • 打赏
  • 举报
回复
IE中jscript引擎的解析顺序造成的问题.

alert(aa.value); 这个不是标准的写法. 一般表示ID为aa的节点的value.

var aa = "123", 引擎先看到的是声明. 但是alert(aa.value)的时候还没有被赋值.
jianxin1414 2010-02-08
  • 打赏
  • 举报
回复
。。。。。这个问题
itliyi 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xiaofanku 的回复:]
回家了!没意义的讨论!饿4了
[/Quote]
街头小贩 2010-02-06
  • 打赏
  • 举报
回复
回家了!没意义的讨论!饿4了
2010-02-06
  • 打赏
  • 举报
回复
晕。。。

我说的是var定义被会先解析。并没说会隐式的var一次
街头小贩 2010-02-06
  • 打赏
  • 举报
回复
我倒!你不是说不报错么?你用的是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);
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
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有错,这个还是没想明白。
街头小贩 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
按你说的,一个块里的变量如果没有事先var,那么会先进行var解析,其结果是undefined,那么为什么这个aa却能直接使用到aa.value呢?
[/Quote]
把你的全部代码晒晒
街头小贩 2010-02-06
  • 打赏
  • 举报
回复
把你的全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在这要起作用!
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
按你说的,一个块里的变量如果没有事先var,那么会先进行var解析,其结果是undefined,那么为什么这个aa却能直接使用到aa.value呢?


[Quote=引用 11 楼 free_wind22 的回复:]
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>
[/Quote]
2010-02-06
  • 打赏
  • 举报
回复
更正:
在执行alert(aa.value)时候,aa的值就是undefined, 调用aa.value就会报错
2010-02-06
  • 打赏
  • 举报
回复
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>
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
我又在google chrome里运行了一下,两种情况都没有报错。呵呵,真有趣。
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
我是在IE7下运行的,算不算早期?

第二个问题,没有你这句var ,也能直接用aa,问题就是这是谁在什么时候给定义好的呢?

[Quote=引用 6 楼 xiaofanku 的回复:]
可以在js里直接访问,不需要通过document.getElementById
re:
这种想法就是错的!在IE的早期或许好用.

那么这个aa的变量是谁在什么时候定义好的呢?
re:
你是说这样么?
var aa=document.getElementById('aa');
[/Quote]
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
楼上的,你给的信息太多了,我从哪里看,好人啊,直接给答案吧。谢谢!
街头小贩 2010-02-06
  • 打赏
  • 举报
回复
可以在js里直接访问,不需要通过document.getElementById
re:
这种想法就是错的!在IE的早期或许好用.

那么这个aa的变量是谁在什么时候定义好的呢?
re:
你是说这样么?
var aa=document.getElementById('aa');
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoukang0916 的回复:]
我喜欢楼主的ID
[/Quote]

CSDN的早期注册的,当时想也没想就用了中文了。
一脚滑倒 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaofanku 的回复:]
你写的不规范:
try:
HTML code<BODY><INPUTTYPE="text" id="aa" name="aa" value="aaaa"></BODY><SCRIPTtype="text/javascript"><!--
alert(document.getElementById('aa'));var aa='abc';
alert(aa);//--></SCRIPT>
[/Quote]

其实我的问题是,定义了一个id='aa'的元素,可以在js里直接访问,不需要通过document.getElementById。那么这个aa的变量是谁在什么时候定义好的呢?
然后,为什么后面我使用var aa来定义之后,会导致前面那句又不可以用了呢?
sohighthesky 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoukang0916 的回复:]
我喜欢楼主的ID
[/Quote]
同上
PandaIT 2010-02-06
  • 打赏
  • 举报
回复
我喜欢楼主的ID
加载更多回复(4)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧