什么是闭包和回调函数?

20

什么是JavaScript中的闭包和回调函数?我还没有找到一个好的解释。


https://dev59.com/VXNA5IYBdhLWcg3wF5uO - Mehrdad Afshari
6
你有没有在 Google 中尝试搜索 "closure javascript site:stackoverflow.com"?(不要使用 SO 自身的搜索框,它很垃圾)有很多地方可以了解闭包的描述。 - AnthonyWJones
https://dev59.com/6XVD5IYBdhLWcg3wBm5h - Upperstage
参考:https://dev59.com/5XRB5IYBdhLWcg3wc3A0闭包和回调的区别是什么? - Mahesh K
1个回答

39

闭包在Stackoverflow上已经被很好地处理了,以下是其中的一些精选问题:

JavaScript闭包的工作原理是什么?
JavaScript中“闭包”到底指的是什么?
你能说这是Javascript闭包的正确示例吗?我们需要考虑避免闭包的情况?
JavaScript作用域和闭包
JavaScript闭包和“this”上下文
JavaScript - 如何学习“闭包”使用?

回调函数是一个更简单的概念。回调函数基本上是一个函数接受另一个函数作为参数。在执行期间,在某个时刻,被调用的函数将执行作为参数传递的函数,这就是一个回调。很多时候回调实际上发生在异步事件中,这种情况下,被调用的函数可能在没有执行回调函数的情况下返回,这可能会稍后发生。这里是一个常见(基于浏览器)的示例:

 function fn() { alert("Hello, World"); }
 window.setTimeout(fn, 5000);

这里将函数fn作为setTimeout函数的回调函数传递。 setTimeout函数会立即返回,然后5秒钟后执行作为回调函数传递的函数。

闭包和回调函数

经常创建闭包的原因(无论是意外地还是有意地)是需要创建回调函数。例如:

 function AlertThisLater(message, timeout)
 {
     function fn() { alert(message); }
     window.setTimeout(fn, timeout);
 }

 AlertThisLater("Hello, World!", 5000);

(请阅读一些链接帖子以了解闭包)

闭包在一定程度上包含了message参数,fn在调用AlertThisLater并返回一段时间后被执行,但是fn仍然可以访问message的原始内容。


回调函数最常与setTimeout一起使用吗? - user154759
1
setTimeout是一种常见的用法,但同样常见的是在XmlHttpRequest对象上使用“onreadystatechange”。您还会看到大量使用回调函数的代码,这些代码使用JavaScript框架(如JQuery)。在许多情况下,回调函数只是您提供一点逻辑来自定义一个大型但否则标准的过程的位置。此外,回调经常用于在一组对象上执行相同的函数。 - AnthonyWJones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接