请大家看看这段代码,javascript的for究竟是怎么回事啊!!

mis98ZB 日电卓越软件科技(北京)有限公司 开发总监  2002-07-25 05:08:02
以下两个页面,功能一样,但是一个用for,一个用while。结果就完全不一样了:

TestA.html:
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<script language="JavaScript">
function TestBreak(txtTest)
{
for(cntI = 0; cntI < txtTest.length; cntI++)
if(txtTest.charAt(cntI) == "8") break;
return(cntI == txtTest.length);
}

function TestBreak2(txtTest2)
{
for(cntI = 0; cntI < txtTest2.length; cntI++)
if(txtTest2.charAt(cntI) == "9" || !TestBreak(txtTest2.charAt(cntI))) break;
window.alert("cntI = " + cntI);
}
</script>
</HEAD>
<BODY>
<center>
<form>
<INPUT name=CheckNum size="27" type="button" value="CheckNum" onclick="TestBreak2(txtNum.value);">
<INPUT name=txtNum size=12>
</form>
</center>
</BODY>
</HTML>



TestB.html:
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<script language="JavaScript">
function TestBreak(txtTest)
{
for(cntI = 0; cntI < txtTest.length; cntI++)
if(txtTest.charAt(cntI) == "8") break;
return(cntI == txtTest.length);
}

function TestBreak2(txtTest2)
{
var cntI = 0;
while(cntI < txtTest2.length){
if(txtTest2.charAt(cntI) == "9" || !TestBreak(txtTest2.charAt(cntI))) break;
cntI++
}
window.alert("cntI = " + cntI);
}
</script>
</HEAD>
<BODY>
<center>
<form>
<INPUT name=CheckNum size="27" type="button" value="CheckNum" onclick="TestBreak2(txtNum.value);">
<INPUT name=txtNum size=12>
</form>
</center>
</BODY>
</HTML>

在页面的文本框中输入“123456789”,TestA.html会陷入死循环,而TestB.html则能正常执行。
javascript的for究竟是怎么回事啊!!
...全文
9 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mis98ZB 2002-07-25
补充一下:

我的第二个回复中把两个函数的名字写反了……
:(
回复
mis98ZB 2002-07-25
呵呵,刚才跟踪了一下,全明白了。
确实如qiushuiwuhen(秋水无恨)所说。
看来c++要求显式声明变量是大有来头的,从根本上杜绝了这一类的错误……
:)

不过js居然默认为全局变量,太奇怪了!!
不过执行起来确实跟局部变量没有什么两样,毕竟是单线程的……

好了,不说了,
感谢大家为我解答这个问题!!
现在开始给分。
回复
qiushuiwuhen 2002-07-25
1.js中不申明局部,默认为全局
2.单句可不需要{},但为了严谨
3.c++更应该有作用域的概念
回复
mis98ZB 2002-07-25
qiushuiwuhen(秋水无恨):
谢谢你的回复!
可是我觉得cntI应该是局部变量吧?要不然也太奇怪了……
呵呵,上面的代码是我写的sample,真正的代码是一些数据有效性check函数,它们之间相互调用。结果就出现了上面提到的问题。瞎忙呼了大半天……@_@

freezwy(网络自由人):
谢谢再次关注! :)
可是在TestB.html里边
for(cntI = 0; cntI < txtTest.length; cntI++)
if(txtTest.charAt(cntI) == "8") break;
也没有加{}啊,可是它就过的去……
*_*?

也谢谢evonne_feng(evonne)的回复,这样做问题确实解决了。 :)
回复
mis98ZB 2002-07-25
明白!!

哈哈,我一直是用c++的,最近作个主页,不小心出了问题…… :)

是不是这样的:

执行函数TestBreak(txtTest)的时候,解释器产生一个局部变量cntI,然而当调用函数TestBreak2(txtTest2)的时候,解释器发现已经有了一个cntI了(TestBreak2(txtTest2)确实在cntI的有效域内),所以就不再产生一个新的局部变量了。
唔,莫非这就是隐式声明变量的坏处!?
回复
evonne_feng 2002-07-25
增加一行var cntI就OK了。要注意变量的使用域
function TestBreak(txtTest)
{
var cntI;
for(cntI = 0; cntI < txtTest.length; cntI++)
if(txtTest.charAt(cntI) == "8") break;
return(cntI == txtTest.length);
}
回复
freezwy 2002-07-25
必须加的。
回复
freezwy 2002-07-25
必须加的。
回复
qiushuiwuhen 2002-07-25
原因不在于for和while的区别,是因为变量域问题
TestB.html中var cntI = 0; 申明cntI为局部变量.
否则大家一起用全局cntI(默认),从而产生冲突

ps.不过有点看不懂你的function用来干什么?
回复
mis98ZB 2002-07-25
谢谢 freezwy(网络自由人)关注!!

但是,在A中:
for(cntI = 0; cntI < txtTest.length; cntI++)
if(txtTest.charAt(cntI) == "8") break;

for(cntI = 0; cntI < txtTest2.length; cntI++)
if(txtTest2.charAt(cntI) == "9" || !TestBreak(txtTest2.charAt(cntI))) break;

两个for中都只有一条语句,不用加{}吧?
回复
freezwy 2002-07-25
for后要加{和}来限定函数的范围,否则就哈哈了。
回复
发动态
发帖子
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
社区公告
暂无公告