1

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

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

根据我的理解,当内部函数访问其父函数的局部变量时,就会创建闭包。该参数p是本地的foo,如果内部函数可以访问p,是否意味着创建了一个闭包?

4

3 回答 3

1

是的,这正是这里发生的事情。您返回的内部函数可以p通过本地范围访问参数,所以您是正确的。

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

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

这里有一个非常详细的解释:Explaining JavaScript Scope And Closures

于 2013-07-11T09:16:34.813 回答
1

函数的参数存在于函数的局部范围内,所以是的,它创建了一个闭包

于 2013-07-11T09:16:48.283 回答
0

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

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

这样做是让您能够在变量中创建“闭包”或关闭以反复使用。我可以创建一个函数:

var adder4 = adder(4);

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

您还可以通过匿名函数和点击处理程序看到很多,但您可以通过谷歌搜索以获得更好的答案。

希望这可以帮助。

于 2013-07-11T09:24:54.840 回答