新手Javascript:使用添加的括号调用函数时不运行(即使它不需要参数)

时间:2012-06-22 15:17:20

标签: javascript function

这是我的功能,提醒我childNodes标记的body的数量。

    function countBodyChildren() {
      var body_element = document.getElementsByTagName("body")[0];
      alert(body_element.childNodes.length);
}

 window.onload = countBodyChildren;

该函数运行正常,但是当我将()添加到函数名的末尾,即window.onload = countBodyChildren();时,函数不会运行。为什么是这样?我想调用函数,即使它们不需要任何参数,你总是将()添加到其名称的末尾。

3 个答案:

答案 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引擎可以在事件发生时调用该函数。