首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包有什么用(在JS中)?

问闭包有什么用(在JS中)?
EN

Software Engineering用户
提问于 2013-07-03 03:23:29
回答 2查看 19.2K关注 0票数 4

在我寻求理解JS上下文中的闭包时,我发现自己在问自己为什么需要使用闭包?即使在父函数返回之后,有一个内部函数能够访问父函数的变量有什么好处呢?我甚至不确定我问的问题是否正确,因为我不知道如何使用它们。

有人能给出一个在JS中的真实世界的例子吗?在这个例子中,闭包相对于替代方案更有益处,不管这是什么?

编辑:为什么闭包对JavaScript很重要?的问题没有足够清楚地回答我想要理解的内容。所以我不认为这是重复的。

我将看看所有的答案/资源,我将标记一个被接受的答案。感谢大家!

EN

回答 2

Software Engineering用户

发布于 2013-07-03 03:39:28

闭包真正有用的一点是,它们允许您将任意数据放在回调中,而不依赖于函数签名。

一个很好的现实世界的例子是动画。JS不是我最强大的语言,所以我甚至不会尝试为它编写代码,但是我的基本想法是:

假设您有一个名为Timer的函数,它接受两个参数,一个间隔和一个回调。(我知道DOM有类似的东西,用于在JavaScript中实现动画。)在间隔结束后,它调用您的回调,如下所示:CallbackFunction();

看到明显的问题了吗?它不会返回回调函数中可能需要的数据。有些回调系统允许您在设置一个任意对象时传入它,然后当回调被调用时,它将该对象作为上下文传递回来。但是如果你在回调中需要两条数据的话,事情就变得一片狼藉,等等.

解决方案是传递一个闭包,并让它接近您需要的所有数据。然后,可以在以后的某个时间(例如,在计时器运行之后)以回调的形式调用它,并且它可以保存它执行其工作所需的所有数据(包括变量)。

票数 5
EN

Software Engineering用户

发布于 2013-07-03 13:26:38

这个例子非常类似于引力pretty‘。正如Mason和Jan所指出的,异步代码是最常见的情况;但是它对于本地化模块也很有用(模块的意思是“一段代码,它执行自己的单个任务)。

代码语言:javascript
复制
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文件的大型公司项目中,将会有很多变量名。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/203507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档