这是我的功能,提醒我childNodes
标记的body
的数量。
function countBodyChildren() {
var body_element = document.getElementsByTagName("body")[0];
alert(body_element.childNodes.length);
}
window.onload = countBodyChildren;
该函数运行正常,但是当我将()
添加到函数名的末尾,即window.onload = countBodyChildren();
时,函数不会运行。为什么是这样?我想调用函数,即使它们不需要任何参数,你总是将()
添加到其名称的末尾。
答案 0 :(得分:9)
我想调用函数,即使它们不需要任何参数,也总是将()添加到其名称的末尾。
你想的没错。但是在这里,你不想调用这个函数;你想告诉浏览器什么时候来电话。
当您添加括号时,您将立即(不加载)调用该函数。该函数执行;尝试查找body
元素,但尚未加载;因此body_element
最终为undefined
。您在childNodes
上查找undefined
,然后收到错误消息。 window.onload
任务不会发生。
即使您的函数没有抛出错误,它也会返回undefined
,因此window.onload
变为undefined
,因此最终加载页面时没有任何反应。
相反,你需要开始认为函数只是另一种价值。当你说
function a() {
// ...
}
它与此相同:
a = function() {
// ...
};
(实际上存在差异,重要的一些,但它们现在无关紧要;当你掌握了基础知识时,请查看它们)。现在,函数“包含”在变量a
中。然后你可以这样做:
var b = a;
b();
它会工作 - 你将a
(你的函数)中的任何内容放入变量b
中,然后通过调用它的新名称来执行它(从现在开始{{1} }和a
指的是同一个函数)。以同样的方式,在
b
window.onload = countBodyChildren;
对象的onload
属性现在包含您的函数。然后,浏览器将在加载完成时执行任何操作。
你有一个过早执行的案例。
答案 1 :(得分:1)
window.onload
期望的是对函数或函数定义的引用。
当你加上括号时,你实际上执行了这个函数,它是分配给window.onload
的函数的返回值。
答案 2 :(得分:1)
window.onload = countBodyChildren();
这就是说“调用函数,并将函数的返回值赋给window对象的onload属性。你的函数什么都不返回。
例如
function countBodyChildren() {
var body_element = document.getElementsByTagName("body")[0];
alert(body_element.childNodes.length);
return 5;
}
window.onload = countBodyChildren();
将为onload prop分配5。不是你想要的。你需要为onload prop赋予一个函数引用,所以js引擎可以在事件发生时调用该函数。