为什么函数调用不能这样工作?

时间:2011-09-13 11:30:46

标签: javascript function

这是我在页面加载时测试的脚本。

window.onload = initAll;

function initAll() {
document.getElementById("pTag").innerHTML = "Hello Java Script !";
}

上面的脚本工作正常,直到我在initAll()期间加上call. _( window.onload=initAll(); )_这样的括号。如果在函数调用期间使用initAll(),则不会发生任何事情。这就像剧本不在那里。

为什么会这样?

6 个答案:

答案 0 :(得分:3)

window.onload期望为它设置的值是一个函数(函数就像JavaScript中的任何其他对象一样)。

如果你在initAll之后放置了parens,你实际上调用函数并将window.onload设置为函数的返回值。由于该函数没有明确return任何内容,因此该值为undefined。所以在实践中你可以想到这段代码:

window.onload = initAll();

function initAll() {
    // do something with document
}

等同于此代码:

var result = initAll();
window.onload = result;

function initAll() {
    return null;
}

我相信你可以立即明白为什么这不起作用。

答案 1 :(得分:0)

因为您不应该在该行执行该函数,所以应该为窗口对象分配一个事件处理程序,一旦load事件被触发,它将被触发/执行,而不是函数的返回值。

但是,不建议分配事件处理程序window.onload,因为它将允许仅附加一个处理程序。考虑使用addEventListener

答案 2 :(得分:0)

因为您没有直接在window.onload语句中调用该函数,但是您正在为onload事件分配函数。然后,系统将在事件发生时自动调用您的initall函数。这就是为什么你需要函数本身(没有括号),而不是调用(带括号)

答案 3 :(得分:0)

这与Javascript的工作方式有关。函数实际上也是对象,就像javascript中的所有东西一样。 所以基本上,你正在为initAll分配恰好是函数的“对象”window.onload。然后在触发onload事件时调用此对象,假设它是一个函数。

现在,当您将括号放在对象名称后面时,您基本上是在告诉它将该对象视为函数并调用它。这不是如何将它分配给属性的方式,如window.onload属性。

答案 4 :(得分:0)

window.onload = initAll;

您将initAll函数绑定到onload对象的window事件。该函数成为负载处理程序。现在,当load事件触发window对象时,将调用此函数。


window.onload = initAll();

您正在立即调用函数initAll。此调用返回undefined(在您的情况下),undefined值将分配给window.onload。将undefined值分配给onevent属性显然没有效果。

答案 5 :(得分:0)

当您省略此通话中的括号时:

window.onload = initAll;

您正在为window.onload事件分配函数initAll()的参考值。这会导致函数在调用onload事件时执行,因为它们共享相同的参考点。当你使用这样的作业时:

window.onload = initAll();

您正在为window.onload事件分配函数的返回值,在本例中为null。