use*_*737 1 javascript function
我发现这个浏览:
在那里阅读答案后,我不理解函数引用和函数调用的定义和用法.然后我搜索了很多,但目前还不清楚在哪里使用什么.
你可以通过指出概念和用法的不同来帮助我理解这一点吗?我想把它作为未来程序员的参考.
以此为例:
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)
我希望这有助于澄清你的疑问.