函数调用和函数引用有什么区别?
我有以下function
function hello() { alert("hi!"); }
拿这段代码:
var elem = document.getElementById("btn"); elem.onclick = hello;
我的问题可能有点难以理解,所以请耐心等待:这段代码与普通调用完全不同,还是使这段代码需要引用函数variables而不是常规调用? ( hello();
)
我怎么知道我应该在哪里给这个函数提供一个参考,以及什么时候我应该实际调用它?
那么, onclick
属性需要一个函数的引用,在元素被点击时执行。 通常情况下是:
element.onclick = funcRef;
要么
element.onclick = function () { funcRef(); };
(但是,当然,最好使用addEventListener
和attachEvent
)
注意他们两个是如何引用的函数,而不是调用。
当某些事情需要引用时,你不要把它称为…你给它指定一个引用(第一个例子)。
当你想专门调用一个函数时,可以用()
(第二个例子)来调用它。 但请注意,在第二个示例中,仍然有一个对分配给onclick
的函数的引用 – 这只是一个匿名函数。
可能更重要的部分是:
有些人认为你想这样做:
element.onclick = funcRef();
但是,立即执行函数(因为()
),并将其返回值分配给onclick
。 除非返回值是一个函数,否则这不是你想要的。
我认为这个故事的寓意是,当你想/现在需要执行一些东西时,你可以调用这个函数。 如果该function需要以后使用或需要存储,则不要调用它。
你想要立即执行吗? 然后调用它。
a=hello()
表示“调用hello()
ASAP,并将其返回值设置a
”。
另一方面, a=hello
意思是“ a
是hello
的别名,如果你调用a()
,你会得到和调用hello()
相同的结果”
您可以使用后者进行callback等,以便在事件发生后告诉浏览器您想要发生的事情。 例如,你可能想要说“当用户点击”(如例子中)时打电话给你()。 或者,“当AJAX查询返回结果时,对返回的数据调用callback()
函数”。
我怎么知道我应该在哪里给这个函数提供一个参考,以及什么时候我应该实际调用它?
你需要现在运行的function吗?
比添加()来执行它
你需要被引用的function,所以它被称为以后?
不要添加()。
几乎所有JavaScript语句都有返回值。 除非另行指定,JavaScript中的函数在调用时将返回undefined
。 所以,在这个赋值语句中调用你的函数的唯一的上下文,如果它是返回一个函数:
function hello() { return function() { alert("hi!"); } } elem.onclick = hello();
无论如何调用函数,都需要引用你的函数。 这里的区别是你没有明确地调用hello
函数。 您正在将该函数的引用分配给elem
DOM节点的onclick
事件处理函数,以便在针对该Node启动onclick
时调用函数。
hello()意味着你调用该函数,这意味着函数将被直接执行。
而当你有elem.onclick =你好,这被称为callback。 hello没有被直接执行,而是只有当某个事件被触发时(在这种情况下,当单击元素时)