关于javascript:调用函数和引用函数之间的区别?

Difference between calling function and referencing function?

看下面的代码:

1
window.onload = someFunction;

很多时候我看到使用这种代码,甚至我使用相同的代码。 但是,仍有一些事情尚不清楚。

  • 上面是一旦页面加载就调用someFunction,对。 但是,我们不应该用括号()调用函数吗?
  • 根据我的理解,我们只是将someFunction分配给window.onload,因此我们可以或不应该调用window.onload();
  • 是否有这种情况,当functionName()functionName成为可互换的时候。 因为在很多地方,在各种API中,我看到调用函数没有括号。

  • 你没有调用这个函数,你告诉浏览器调用哪个函数,onload。

    引用函数和调用函数永远不可互换:它们是完全不同的东西。

    但是,您可以调用一个返回函数的函数:

    1
    2
    3
    4
    5
    6
    7
    function getFunction() {
        return function() {
            alert("I'm the real onload function.");
        };
    }

    window.onload = getFunction();

    在这种情况下,您正在为窗口onload事件注册回调函数。为此,您提供对该函数的引用,您不执行该函数(当然,除非执行该函数返回另一个用作回调处理程序的函数)。您指定的函数将在onload事件发生时执行,即页面完成加载时执行。


    在JavaScript中,括号很重要。在您的情况下,您将函数对象本身分配给某个window的插槽。放括号时,显式调用该函数,因此someFunction()的值是函数的返回值,而不是函数对象本身。简而言之 :

    • 当您看到没有括号的函数时,您将面对一个具有函数对象本身值的表达式
    • 当你看到带括号的函数时,表达式的值是函数的返回值,因为括号表示调用了函数

    一个特殊情况是someVar = new someConstructor;,一般不应该使用,并不遵循我上面的简短说明。有关功能的非常好的解释,以及上面的特定声明,请参阅道格拉斯克罗克福德Javascript的好书,好的部分。