[英]Newbie Javascript: Function doesn't run when calling it with added parenthesis (even though it doesn't need parameters)
这是我的功能,提醒我body
标签的childNodes
数量。
function countBodyChildren() {
var body_element = document.getElementsByTagName("body")[0];
alert(body_element.childNodes.length);
}
window.onload = countBodyChildren;
该函数运行正常,但是当我将add ()
添加到函数名的末尾时,即window.onload = countBodyChildren();
该功能无法运行。 为什么是这样? 我想调用函数,即使它们不需要任何参数,你总是将()
添加到它的名字的末尾。
我想调用函数,即使它们不需要任何参数,你总是将()添加到它的名字的末尾。
你没想到。 但是在这里,你不想调用这个函数; 你想告诉浏览器什么时候来电话。
添加括号时,将立即调用该函数(不加载)。 该函数执行; 试图查找body
元素,但尚未加载; 所以你body_element
最终undefined
为undefined
。 您在undefined
查找childNodes
,并收到错误。 window.onload
赋值不会发生。
即使你的函数没有抛出错误,它也会返回undefined
,因此window.onload
变得undefined
,所以当最终加载页面时没有任何反应。
相反,你需要开始认为函数只是另一种价值。 当你说
function a() {
// ...
}
它与此相同:
a = function() {
// ...
};
(实际上存在差异,重要的是,但它们现在无关紧要;当你掌握了基础知识时,请查看它们)。 现在,函数“包含”在变量a
。 然后你可以这样做:
var b = a;
b();
它会工作 - 你把(你的函数)中a
任何东西放入变量b
,然后通过调用它的新名称来执行它(因为现在a
和b
引用相同的函数)。 以同样的方式,之后
window.onload = countBodyChildren;
window
对象的onload
属性现在包含您的函数。 然后,浏览器将执行加载完成后的任何操作。
你有一个过早执行的情况。
window.onload
期望的是对函数或函数定义的引用。
放置括号时,实际执行该函数,它是分配给window.onload
的函数的返回值。
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道具分配5。 不是你想要的。 你需要为onload prop分配一个函数引用,所以js引擎可以在事件发生时调用该函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.