参数变量是否在JavaScript中创建闭包?

时间:2013-07-11 09:14:55

标签: javascript closures

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

以下是一个非常详细的解释:Explaining JavaScript Scope And Closures

答案 1 :(得分:1)

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

答案 2 :(得分: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)。现在这样做的逻辑相同,并为您提供74仍然是封闭的,或者在“闭包”中,但你可以自由地替换函数中间的另一个变量。

你也可以通过匿名函数和点击处理程序看到这一点,但你可以谷歌搜索更好的答案。

希望这会有所帮助。