Javascript 函数内部的document.forms.length返回0,函数外部正常工作
有人能给我解释一下为什么下面的代码在函数内部不能工作,但在函数外部却能完美工作吗Javascript 函数内部的document.forms.length返回0,函数外部正常工作,javascript,forms,dom,Javascript,Forms,Dom,有人能给我解释一下为什么下面的代码在函数内部不能工作,但在函数外部却能完美工作吗 function calculate_document_forms_length(){ document.forms.length; } 从控制台运行它会返回“undefined”,但当我从控制台运行document.forms.length时,它本身会返回页面上的表单数。我试着去理解为什么这不起作用,但我找不到原因。它发生在firefox和chrome中。我看没有理由不这样做 编辑以澄清一些事情 它在页
function calculate_document_forms_length(){
document.forms.length;
}
从控制台运行它会返回“undefined”,但当我从控制台运行document.forms.length时,它本身会返回页面上的表单数。我试着去理解为什么这不起作用,但我找不到原因。它发生在firefox和chrome中。我看没有理由不这样做
编辑以澄清一些事情
它在页面加载完成后从控制台运行。下面返回正确的值
document.forms.length;
所以我不知道它为什么会这样
好的,这是测试HTML页面的确切来源
<html>
<head>
<title>test page 01</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
<form>
<input type="text" name="test1" />
</form>
<form>
<input type="text" name="tes2" />
</form>
</body>
</html>
测试第01页
正如您在标记中看到的,没有框架,只有纯HTML和表单。您在那里使用的函数不会返回任何内容(即,当您运行它时,它“返回”
未定义的内容。请尝试以下方法:
function() {
return document.forms.length;
}
另外,如果在控制台中仅运行该函数,仍然会得到未定义的
,因为您仍然没有调用该函数。您只是在创建它,但它仍然没有被执行
如果要在控制台中运行它,可以编写
(function() {
return document.forms.length;
}());
最后,如果您只是在控制台中编写document.forms.length
,控制台将显示该值,因为length
是一个变量。这就是为什么它看起来有效。这并不能回答为什么,但如果您返回它,它会起作用:
function aa(){
return document.forms.length;
}
是否在呈现HTML之前调用函数?它是从控制台运行的。页面运行完成后。我等到这一页写完,然后再写。我怀疑如果我把它放在函数中或不放在函数中会有什么不同,因为document.forms.length在函数之外工作得很好。没有,如上所述,经过重新编辑,完整的代码在那里。我原来的一个做了一个console.log,它在另一个函数中,但它仍然不想做。返回对未定义的值没有帮助。@133794m3r:您原来的值?如果您在控制台中编写了function(){console.log(document.forms.length);}
,您仍然只是在创建一个函数,而不是执行它。但是如果您编写(function(){console.log(document.forms.length);}())
,它将创建并执行该函数,并在控制台中记录长度。我可以向你保证它是有效的,因为我自己刚刚试过,那么为什么下面的一个不起作用呢。我最初认为这与函数本身有关。我有一个函数调用它,它总是说下面的变量“len”是0。var len=document.forms.length;它是从函数本身运行的。我最初写这篇文章的想法是“函数内部”的问题。现在我不知道我应该关闭这个,打开一个带有完整代码的新的,还是永远留在这里。@133794m3r:如果它说0
,那么它不是说未定义的
-差别很大。我猜您是在页面加载完成之前调用函数的——在这种情况下,表单的数量实际上将为零。看看这个:很可能是这样。我忘了等待dom就绪,因为我习惯于只使用jquery。我写了一个小东西,用纯javascript写,看看我对这种奇怪的晦涩语言的记忆有多好。我将把你的答案记下来,因为我好像忘了。