在我寻求理解JS上下文中的闭包时,我发现自己在问自己为什么需要使用闭包?即使在父函数返回之后,有一个内部函数能够访问父函数的变量有什么好处呢?我甚至不确定我问的问题是否正确,因为我不知道如何使用它们。
有人能给出一个在JS中的真实世界的例子吗?在这个例子中,闭包相对于替代方案更有益处,不管这是什么?
编辑:为什么闭包对JavaScript很重要?的问题没有足够清楚地回答我想要理解的内容。所以我不认为这是重复的。
我将看看所有的答案/资源,我将标记一个被接受的答案。感谢大家!
发布于 2013-07-03 03:39:28
闭包真正有用的一点是,它们允许您将任意数据放在回调中,而不依赖于函数签名。
一个很好的现实世界的例子是动画。JS不是我最强大的语言,所以我甚至不会尝试为它编写代码,但是我的基本想法是:
假设您有一个名为Timer的函数,它接受两个参数,一个间隔和一个回调。(我知道DOM有类似的东西,用于在JavaScript中实现动画。)在间隔结束后,它调用您的回调,如下所示:CallbackFunction();
看到明显的问题了吗?它不会返回回调函数中可能需要的数据。有些回调系统允许您在设置一个任意对象时传入它,然后当回调被调用时,它将该对象作为上下文传递回来。但是如果你在回调中需要两条数据的话,事情就变得一片狼藉,等等.
解决方案是传递一个闭包,并让它接近您需要的所有数据。然后,可以在以后的某个时间(例如,在计时器运行之后)以回调的形式调用它,并且它可以保存它执行其工作所需的所有数据(包括变量)。
发布于 2013-07-03 13:26:38
这个例子非常类似于引力pretty‘。正如Mason和Jan所指出的,异步代码是最常见的情况;但是它对于本地化模块也很有用(模块的意思是“一段代码,它执行自己的单个任务)。
counter = 0;
function incrementCounter() {
counter += 1;
return counter;
}
// Define Ryu's attack functions here
function lightPunch() {
//TODO
}
function counter() {
//TODO
}
function getCounterValue() {
return counter;
}getCounterValue()将返回什么?我甚至不确定,我认为这将是我声明的函数,而不是数字。如果以某种方式将它们分离为闭包(有几种方法可以这样做;重力列出了一个很好的例子),那么变量名称就不可能混淆。在一个包含50+ JS文件的大型公司项目中,将会有很多变量名。
https://softwareengineering.stackexchange.com/questions/203507
复制相似问题