提问人:frrlod 提问时间:4/9/2013 最后编辑:Defaultfrrlod 更新时间:4/9/2013 访问量:17609
函数调用和函数引用有什么区别?
What is the difference between a function call and function reference?
问:
我有以下功能
function hello() {
alert("hi!");
}
以这段代码为例:
var elem = document.getElementById("btn");
elem.onclick = hello;
我的问题可能有点难以理解,所以请耐心等待:
这段代码与普通调用的确切区别是什么,或者是什么让这段代码需要引用函数变量而不是常规调用?(hello();
)
我怎么知道我应该在哪里引用该函数,以及我应该何时实际调用它?
答:
好吧,该属性需要对函数的引用,以便在单击元素时执行该函数。通常为:onclick
element.onclick = funcRef;
或
element.onclick = function () {
funcRef();
};
(但当然,最好使用addEventListener
attachEvent
)
请注意,它们都是对函数的引用,而不是调用。
当某物需要引用时,你不会称它为......您为其分配一个引用(第一个示例)。
当您想专门调用函数时,请使用(第二个示例)调用它。但请注意,在第二个示例中,仍然有一个对分配给的函数的引用 - 它只是一个匿名函数。()
onclick
可能更重要的部分:
有些人认为你想这样做:
element.onclick = funcRef();
但这会立即执行函数(因为 ),并将其返回值分配给 。除非返回值是函数,否则这不是您想要的。()
onclick
我认为这个故事的寓意是,当你现在想要/需要执行某些东西时,你调用该函数。如果函数需要供以后使用或需要存储,则不要调用它。
评论
element.onclick = getClickHandler()
我怎么知道我应该在哪里引用该函数,以及我应该何时实际调用它?
您现在需要运行该函数吗?
比添加 () 来执行它
您是否需要函数才能被引用,以便稍后调用?
不要添加 ()。
无论函数如何被调用,都需要在某处引用函数。此处的区别在于您没有显式调用该函数。您正在将对该函数的引用分配给 DOM 节点的事件处理程序,以便在为该节点触发时调用您的函数。hello
elem
onclick
onclick
hello() 表示您调用该函数,这意味着该函数将直接执行。
而当您有 elem.onclick = hello 时,这称为回调。hello 不会直接执行,而仅在触发特定事件时执行(在本例中,当单击元素时)
你希望它现在执行吗?然后调用它。
a=hello()
表示“尽快调用,并将其返回值设置为”。hello()
a
另一方面,表示 “ 是 的别名。如果调用 ,则得到与调用相同的结果a=hello
a
hello
a()
hello()
"
你使用后者进行回调等,你想告诉浏览器你想在事件发生后发生什么。例如,您可能希望说“用户单击时呼叫”(如示例中所示)。或者,“当 AJAX 查询返回结果时,对返回的数据调用该函数”。hello()
callback()
JavaScript 中几乎所有的语句都有一个返回值。除非另有说明,否则 JavaScript 中的函数将在调用时返回。因此,如果函数要返回一个函数,则在此赋值语句中调用函数的唯一上下文:undefined
function hello() {
return function() {
alert("hi!");
}
}
elem.onclick = hello();
评论
var = hello
var()
hello()
var()