【问题标题】:understanding javascript function call and referance了解javascript函数调用和引用
【发布时间】:2013-11-01 17:44:41
【问题描述】:

我发现这个浏览:

What is the difference between a function call and function reference?

看了那里的答案后,我不明白函数引用和函数调用的定义和用法。然后查了很多,还是不清楚在哪里用什么。

您能否通过指出概念和用法上的差异来帮助我理解这一点?我想以此作为未来程序员的参考。

【问题讨论】:

  • 听起来您缺少的是函数是 JavaScript 中的对象这一事实。对函数的引用可以像任何变量一样被传递。只有在括号后面加括号时才会调用它。

标签: javascript function


【解决方案1】:

以此为例:

function foo() {
    alert('foo');
    return 'bar';
}

首先,什么是函数?这是一个可以调用(或“调用”或“执行”)的例程,当你这样做时,它通常做某事,并且返回一些值.

所以你有一个名为foo 的函数。您可以通过在其名称后添加() 来调用它:

foo();

如果将调用结果分配给变量,则可以将返回值存储在变量中:

var something = foo();
something === 'bar'; // true

但这并不是 JavaScript 函数所能做的全部。它是一种语言,其中函数是一等公民,因此它们可以传递给其他函数,并从其他函数返回。它们也可以存储为变量。例如:

var refToFoo = foo;

现在refToFoofoo 相同。它不是一个副本,它是一个引用,它指向与foo 相同的(内部)函数对象。所以你可以像使用foo一样使用refToFoo

var something = refToFoo();
something === 'bar'; // true
refToFoo === foo; // true; they're the same object

也许函数引用最常见的用途是将它们用作事件侦听器:

someElement.onclick = foo;

注意上面没有括号。如果我们使用括号,foo 将立即被调用,其返回值将分配给元素的 onclick 方法。由于该函数返回一个字符串,因此如果单击该元素不会发生任何事情。这是新手常犯的错误。另一个常见的方法是调用函数而不是传递对 setTimeout 的引用:

setTimeout(foo(), 1000); // WRONG - foo is executed immediately

比较一下:

setTimeout(foo, 1000); // RIGHT - we're passing a reference to the function, 
                       // that will be invoked by the js engine after 1000ms

我希望这有助于澄清您的疑问。

【讨论】:

    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2019-06-07
    • 2011-11-11
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多