gpt4 book ai didi

javascript - 函数返回是否需要被称为闭包

转载 作者:数据小太阳 更新时间:2023-10-29 05:55:21 24 4
gpt4 key购买 nike

嘿,我在 youtube 上看到了这个视频 http://www.youtube.com/watch?v=KRm-h6vcpxs

基本上解释了 IIFE 和闭包。但我不明白的是我是否需要返回一个函数才能将其称为闭包。

例如

function a() {
var i = 10;
function b() {
alert(i);
}
}

在这种情况下,我可以将其称为闭包,因为它正在从外部函数的范围访问“i”变量,还是我需要像这样返回函数

return function b(){alert(i);}

最佳答案

闭包只是一个函数,它保持着它的词法环境,直到它自己死了才让它离开。

将闭包想象成守财奴叔叔:

enter image description here

史高治叔叔是个守财奴。他永远不会放弃他的钱。

同样,闭包也是一个守财奴。它不会放弃它的变量,直到它自己死去。

例如:

function getCounter() {
var count = 0;

return function counter() {
return ++count;
};
}

var counter = getCounter();

看到函数 counter 了吗? getCounter 函数返回的那个?该功能是一个守财奴。它不会放弃 count 变量,即使 count 变量属于 getCounter 函数调用并且该函数调用已经结束。因此,我们将 counter 称为闭包。

看到每个函数调用都可能创建变量。例如,调用 getCounter 函数会创建一个变量 count。现在这个变量 count 通常会在 getCounter 函数结束时消失。

但是 counter 函数(可以访问 count 变量)不允许它在调用 getCounter 结束时结束。这是因为 counter 函数需要 count。因此它只允许 count 在它自己死后死掉。

现在需要注意的真正有趣的事情是 counter 是在对 getCounter 的调用中产生的。因此,当对 getCounter 的调用结束时,甚至 counter 也应该死掉——但它没有。它甚至在调用 getCounter 结束后仍然存在,因为它脱离了 getCounter 的范围(生命周期)。

counter 可以通过多种方式逃脱getCounter 的范围。最常见的方法是让 getCounter 简单地返回 counter。然而,还有更多的方法。例如:

var counter;

function setCounter() {
var count = 0;

counter = function counter() {
return ++count;
};
}

setCounter();

这里 getCounter 的姊妹函数(恰本地称为 setCounter)将一个新的 counter 函数分配给全局 counter变量。因此,内部 counter 函数脱离了 setCounter 的范围,成为一个闭包。

实际上在 JavaScript 中每个函数都是一个闭包。然而,直到我们处理逃离父函数范围的函数时,我们才意识到这一点并且即使在对父函数的调用结束后,仍然保持属于父函数的一些变量仍然存在。

有关更多信息,请阅读此答案:https://stackoverflow.com/a/12931785/783743

关于javascript - 函数返回是否需要被称为闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586950/

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