gpt4 book ai didi

closures - 闭包定义和示例

转载 作者:行者123 更新时间:2023-12-02 08:04:52 25 4
gpt4 key购买 nike

什么是闭包及其对应示例?

我研究了很多,但无法理解。请从通用编程语言概念方面和特定编程语言方面进行解释。

请帮忙。

谢谢。

最佳答案

闭包基本上是一个嵌套在函数 A 中的函数 B,它可以访问 A 的局部变量:

function A() {
var x = 5;

function B() {
print(x);
}

return B;
}

如果您有 C++ 背景,这是相当难以消化的。当我们尝试调用 A 返回的函数时,x 会发生什么?它会指吗?那不是xA()起无效终止?

答案是x实际上还活着。那B我们返回的居然带有x隐含地围绕着它。很酷,嗯?

从更一般的意义上来说,闭包是绑定(bind)到某些数据的函数。在像 C 这样没有闭包的语言中,每个程序都有固定数量的函数。使用闭包,从某种意义上说,您可以通过将函数绑定(bind)到动态数据来“创建函数”。当然,没有人会阻止您在 C 中模拟闭包,但有时这可能会很痛苦。

闭包确实很有用。例如,假设我们想要实现我们自己的“for 循环”:

function loop(count, f) {
for (var i = 0; i < count; i++)
f(i);
}

var array = [0,1,2,3,4];

loop(5, function(i) {
print(array[i]);
});

允许访问外部变量而不做一堆额外的废话可以使代码变得漂亮和简单。如果没有闭包,您可能必须将上下文变量传递给 loop函数替代:

function loop(count, f, ctx) {
for (var i = 0; i < count; i++)
f(i, ctx);
}

var array = [0,1,2,3,4];

loop(5, function(i, ctx) {
print(ctx[i]);
}, array);

另一个例子:假设我们想在 jQuery 中注册一个回调,但它可能在函数及其调用者及其调用者的调用者运行完毕后很长时间才执行:

$(document).ready(function(){

var clicked = 0;

$('#button').click(function(){
clicked++;
alert("You've pressed the button " + clicked + " times.");
});

});

如果 JavaScript 更像 C++(C++0x 之前),那么 clicked当函数赋予 $(document).ready() 时,变量早已消失。被调用,并且按钮单击回调将具有未定义的行为。

关于closures - 闭包定义和示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3296249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com