参数变量在JavaScript中创建闭包

Does a parameter variable create closure in JavaScript?

本文关键字:创建 闭包 JavaScript 变量 参数      更新时间:2023-09-26

我的任务是追踪我们的一个应用程序中内存泄漏的原因,所以我正在尝试研究闭包。我想知道这个代码是否创建了闭包:

function foo(p)
{
    return function(){ return p + 1; }
}

根据我的理解,闭包是在内部函数访问其父函数的局部变量时创建的。参数pfoo的本地参数,如果内部函数获得了对p的访问权限,是否意味着创建了闭包?

函数的参数存在于函数的本地作用域中,因此是的,它会创建一个闭包

是的,这正是这里发生的事情。您返回的内部函数可以通过本地作用域访问参数p,因此您是正确的。

如果您在返回函数中引用外部函数中的局部变量,它也会创建一个闭包,如下所示:

function foo(p) {
    var q = 4;
    return function() { return p + q; }
}

这里有一个非常详细的解释:解释JavaScript范围和闭包

这确实创建了一个闭包,但它不是javascript中谈论的典型闭包。典型的例子是:

var adder = function(a) {
  return function(b) {
    return a + b;
  }
}

这样做的目的是让您能够在一个变量中创建一个"闭包"或闭包,以便反复使用。我可以创建一个函数:

var adder4 = adder(4);

现在,如果我想在任何数字上加4,我可以使用adder4(2),在这种情况下的结果将是6。这里发生的是为变量a插入4。然后将变量a永久地包含在此函数中。然后,我们可以随时替换变量b来创建一个新函数。因此,当我调用函数adder4(2)时,我使用的是一个已经分配了a的函数。在这种情况下,变量CCD_ 13被分配给变量b。很明显,当您添加42时,您得到的是6。但是您可以使用相同的函数来添加另一个数字,adder4(3)。现在,它执行相同的逻辑,并为您提供74仍然是封闭的,或者在"闭包"中,但是您可以自由地替换函数中间的另一个变量。

你也可以在匿名函数和点击处理程序中看到这一点,但你可以在谷歌上找到更好的答案。

希望这能有所帮助。