我的任务是在我们的一个应用程序中跟踪内存泄漏的原因,所以我正在尝试研究闭包。我想知道这段代码是否会产生闭包:
function foo(p)
{
return function(){ return p + 1; }
}
根据我的理解,当内部函数访问其父函数的局部变量时,会创建闭包。参数p
是foo
的本地参数,如果内部函数获得对p
的访问权限,是否意味着创建了闭包?
答案 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
。显然,当您添加4
和2
时,您会获得6
。但您可以使用相同的功能添加另一个数字adder4(3)。现在这样做的逻辑相同,并为您提供7
。 4
仍然是封闭的,或者在“闭包”中,但你可以自由地替换函数中间的另一个变量。
你也可以通过匿名函数和点击处理程序看到这一点,但你可以谷歌搜索更好的答案。
希望这会有所帮助。