我的任务是追踪我们的一个应用程序中内存泄漏的原因,因此我正在尝试研究闭包。我想知道这段代码是否会创建闭包:
function foo(p)
{
return function(){ return p + 1; }
}
根据我的理解,当内部函数访问其父函数的局部变量时,就会创建闭包。该参数p
是本地的foo
,如果内部函数可以访问p
,是否意味着创建了一个闭包?
我的任务是追踪我们的一个应用程序中内存泄漏的原因,因此我正在尝试研究闭包。我想知道这段代码是否会创建闭包:
function foo(p)
{
return function(){ return p + 1; }
}
根据我的理解,当内部函数访问其父函数的局部变量时,就会创建闭包。该参数p
是本地的foo
,如果内部函数可以访问p
,是否意味着创建了一个闭包?
是的,这正是这里发生的事情。您返回的内部函数可以p
通过本地范围访问参数,所以您是正确的。
如果您在返回函数中从外部函数引用局部变量,它也会创建一个闭包,如下所示:
function foo(p) {
var q = 4;
return function() { return p + q; }
}
这里有一个非常详细的解释:Explaining JavaScript Scope And Closures
函数的参数存在于函数的局部范围内,所以是的,它创建了一个闭包
这确实创建了一个闭包,但它不是 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
。显然,当您添加4
并2
获得6
. 但是您可以使用相同的函数来添加另一个数字 adder4(3)。现在这执行相同的逻辑并为您提供7
. 这4
仍然是封闭的,或者在“闭包”中,但是您可以随意替换函数中间的另一个变量。
您还可以通过匿名函数和点击处理程序看到很多,但您可以通过谷歌搜索以获得更好的答案。
希望这可以帮助。