这个函数是javascript中的闭包吗
is this function a closure in javascript?
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
函数f2()
是闭包吗?如果没有?为什么?
但在这篇文章中。JavaScript闭包是如何工作的?为什么说:
function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp));
}
bar(10);
}
foo(2)
这不是一个结束。闭包是指返回内部函数。内部函数将在离开之前关闭foo的变量为什么?
但是我不知道我做的这个例子和我引用的另一个例子有什么区别,一个不是闭包。但一个是。我认为这两个例子是一样的。
f2
是一个闭包,因为它从外部作用域访问变量(n
(。(好吧,这并不是真正的结束——请参阅下面的更新(。
n
是在f1
内部声明的,而不是在f2
内部声明的;这使得它属于CCD_ 7的范围。因此,当您创建引用n
的函数f2
时,根据定义,它是一个闭包,因为它使用了其他人的变量。
更新
好吧,如果我正确理解了你链接到的答案,它说f2
是而不是闭包,因为它只是访问其范围内的变量(就像if
语句一样,它在大括号*内获得自己的范围,可以使用外部范围的变量,而不需要闭包(。
*更新:发现只有函数在Javascript中有自己的作用域,而不是任何旧块。但我的观点仍然有效
然而,如果f2
离开了f1
的作用域(例如被返回(,它将变成闭包;在这种情况下,它仍然可以访问f1
的变量n
,即使f1
的原始作用域将不复存在(当控件离开函数时,它将退出(。f2
会"封闭"f1
的变量,从而人为地延长f1
的作用域的寿命。
就我个人而言,我仍然会称f2
为闭包,即使它从未离开f1
。如果一个函数只需在其声明范围之外使用,就可以成为闭包,并且无论它在技术上是否是闭包,它在该范围内的行为都没有什么不同,那么我认为没有必要进行区分。我甚至可以说,无论f2
是否是闭包,如果它从未离开f1
的范围,这都是一个实现细节。
另一方面,忽略这种区别意味着任何使用全局变量的函数都将被称为"闭包",因为它从外部范围访问变量。因此,只有当它离开中定义的变量的范围时,它才成为闭包,这是一个有价值的(尽管很微妙(区别。
我想我能给出的最清楚的答案是这还不是一个闭包
它是一个闭包,因为它取决于中间(即不是局部或全局(范围中变量的值,如果变量发生变化,那么闭包的操作也会发生变化。价值总是相同是偶然的。
但是,您可能希望将闭包返回给f1()
的调用者,以便在其他地方使用它。
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- Javascript.闭包和dynamic'这'实际上具有约束力
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 就良好实践而言,带闭包的javascript原型是一件好事吗
- 闭包中的Javascript值
- 用于添加两个数字的javascript闭包的用法
- 什么'这个javascript闭包的区别是什么
- javascript,将参数传递给函数内部的闭包中的回调
- javascript中的闭包对我来说工作方式不同
- 我可以使用JavaScript闭包添加数字吗
- 在Javascript中使用闭包
- 这是在JavaScript中形成闭包的正确方法吗
- 作用域问题-此函数是否形成闭包-JavaScript
- JavaScript - 为什么这个闭包不保存参数
- javascript闭包:保护内部变量
- 如何测试只在闭包范围中可见的javascript方法
- JavaScript闭包&回调函数
- 闭包 JavaScript 有助于理解示例