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

use*_*207 3 javascript function

这里是我的功能来提醒我数childNodes了的body标签.

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

 window.onload = countBodyChildren;
Run Code Online (Sandbox Code Playgroud)

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

Ama*_*dan 9

我想调用函数,即使它们不需要任何参数,你总是将()添加到它的名字的末尾.

你没想到.但是在这里,你不想调用这个函数; 你想告诉浏览器什么时候来电话.

添加括号时,将立即调用该函数(不加载).该函数执行; 试图查找body元素,但还没有加载; 所以你body_element最终成为undefined.你抬头childNodesundefined,并得到一个错误.window.onload任务不会发生.

即使你的函数没有抛出错误,它也会返回undefined,所以window.onload变成了undefined,所以当最终加载页面时没有任何反应.

相反,你需要开始认为函数只是另一种价值.当你说

function a() {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

它与此相同:

a = function() {
  // ...
};
Run Code Online (Sandbox Code Playgroud)

(实际上存在差异,重要的是,但它们现在无关紧要;当你掌握了基础知识时,请查看它们).函数现在"包含"在变量中a.然后你可以这样做:

var b = a;
b();
Run Code Online (Sandbox Code Playgroud)

它会工作-你把什么是a(你的函数)到变量b,然后通过调用其新名称执行它(因为现在无论ab指向同一个函数).以同样的方式,之后

window.onload = countBodyChildren;
Run Code Online (Sandbox Code Playgroud)

对象的onload属性window现在包含您的函数.然后,浏览器将执行加载完成后的任何操作.

你有一个过早执行的情况.