函数不't在添加括号的情况下调用它时运行(即使它不需要参数)

Function doesn't run when calling it with added parenthesis (even though it doesn't need parameters)

本文关键字:运行 参数 不需要 调用 情况下 加括号 添加 函数      更新时间:2023-09-26

以下是我的函数,用于提醒我body标记的childNodes的数量。

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

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

我想调用函数,即使它们不需要任何参数,也总是在其名称的末尾添加((。

你想得对。但在这里,您不想调用函数;你想告诉浏览器时间到了要调用哪个函数。

当您添加括号时,您将立即调用该函数(不在加载时(。功能执行;尝试查找body元素,但尚未加载;所以你的body_element最终变成了undefined。在undefined上查找childNodes,会得到一个错误。window.onload分配未发生。

即使您的函数没有抛出错误,它也会返回undefined,所以window.onload变成undefined,所以当页面最终加载时不会发生任何事情。

相反,你需要开始思考函数只是另一种价值。当你说

function a() {
  // ...
}

它与此相同:

a = function() {
  // ...
};

(事实上,有一些重要的差异,但它们现在无关紧要;当你掌握了基本知识时,就去查找它们(。一个函数现在"包含"在变量a中。然后你可以这样做:

var b = a;
b();

它会起作用——你将a(你的函数(中的任何内容放入变量b中,然后通过调用它的新名称来执行它(因为现在ab都指同一个函数(。同样,在之后

window.onload = countBodyChildren;

CCD_ 21对象的CCD_ 20属性现在包含您的函数。然后,当加载完成时,浏览器将执行其中的任何内容。

你有一个过早执行死刑的案例。

window.onload期望的是对函数或函数定义的引用。

当你插入括号时,你实际上执行了函数,它是分配给window.onload的函数的返回值。

window.onload=countBodyChildren((;

这意味着"调用函数,并将函数的返回值分配给窗口对象的onload属性。您的函数什么都不返回。

例如

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

这将为加载道具指定5。不是你想要的。您需要为onload道具分配一个函数引用,这样js引擎就可以在事件发生时调用该函数。