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

参数变量是否在JavaScript中创建闭包?,javascript,closures,Javascript,Closures,我的任务是在我们的一个应用程序中跟踪内存泄漏的原因,所以我试图研究闭包。我想知道这段代码是否创建了闭包: function foo(p) { return function(){ return p + 1; } } 根据我的理解,闭包是在内部函数访问其父函数的局部变量时创建的。参数p是foo的本地参数,如果内部函数获得了对p的访问权,是否意味着创建了闭包?是的,这正是这里发生的情况。您返回的内部函数可以通过本地范围访问参数p,因此您是正确的 如果在返回函数中引用外部函数中的局部变量,它

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

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

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

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

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

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

这里有一个非常详细的解释:

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

这确实创建了一个闭包,但它不是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
的函数。在这种情况下,变量
2
被分配给变量
b
。显然,当您添加
4
2
时,您会得到
6
。但是您可以使用相同的函数来添加另一个数字,adder4(3)。现在,这将执行相同的逻辑,并为您提供
7
。<代码> 4 <代码>仍然是封闭的,或者在“闭包”中,但是您可以在函数中间替换另一个变量。< /P> 在匿名函数和单击处理程序中,您也会经常看到这一点,但您可以在谷歌上搜索更好的答案


希望这有帮助

仅供参考,JavaScript中的每个函数都是一个闭包,因为每个函数都可以访问更高的作用域。@FelixKling你的意思是说每个函数都有一个更高作用域的快照?我不会说快照,因为听起来函数可以访问所有更高/自由变量的副本。而是环境是相互联系的。如果在函数自身的环境中找不到变量,则会在“父”环境中查找该变量,等等。因此,如果函数实际上有一个自由变量,则可能导致内存泄漏。如果没有,它可能仍然具有访问权限,但我假设引擎现在是智能的,并且仍然会垃圾收集值。虽然每个函数都可以访问更高(外部)的作用域,但并非每个人都同意所有函数(更准确地说,它们的执行上下文)都是闭包。包括我在内的许多人都认为(在javascript中),只有在外部函数完成并返回后维护对内部函数的持久引用时,才存在真正的闭包。在外部函数返回之前,垃圾收集不会删除内部变量,无论内部函数是否存在。当学习将所有函数视为闭包时,通常是没有帮助的。闭包只是一个环境,一个函数对。函数实际上在做什么并不重要。你能解释一下环境、函数对是什么意思吗?我写这篇文章是为了更好地理解闭包,并希望得到一些澄清。我认为维基百科对此解释得很好:。