理解javascript函数调用和referance

use*_*737 1 javascript function

我发现这个浏览:

函数调用和函数引用有什么区别?

在那里阅读答案后,我不理解函数引用和函数调用的定义和用法.然后我搜索了很多,但目前还不清楚在哪里使用什么.

你可以通过指出概念和用法的不同来帮助我理解这一点吗?我想把它作为未来程序员的参考.

bfa*_*tto 8

以此为例:

function foo() {
    alert('foo');
    return 'bar';
}
Run Code Online (Sandbox Code Playgroud)

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

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

foo();
Run Code Online (Sandbox Code Playgroud)

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

var something = foo();
something === 'bar'; // true
Run Code Online (Sandbox Code Playgroud)

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

var refToFoo = foo;
Run Code Online (Sandbox Code Playgroud)

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

var something = refToFoo();
something === 'bar'; // true
refToFoo === foo; // true; they're the same object
Run Code Online (Sandbox Code Playgroud)

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

someElement.onclick = foo;
Run Code Online (Sandbox Code Playgroud)

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

setTimeout(foo(), 1000); // WRONG - foo is executed immediately
Run Code Online (Sandbox Code Playgroud)

比较一下:

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

我希望这有助于澄清你的疑问.