我刚开始学习 JS 中的闭包,有人告诉我,我实际上已经编写了闭包,但没有意识到它们是闭包。我以为这只是一个单例对象/类,但他认为这是一个闭包:
var myWidget = {
counter : 0,
init : function() {
myWidget.left();
myWidget.right();
},
left : function() {
// whatever
},
right : function() {
// whatever
}
}
myWidget.init();
这是闭包吗?如果不是,那是什么?
最佳答案
是的,确实如此。
在该代码示例中,您是:
- 定义一个具有某些属性的普通对象
- 在其中一个属性(函数)内使用闭包来引用您刚刚定义的对象。
我可以看出您是否在定义 var myWidget
在全局作用域或另一个函数内部,您仍将向上遍历作用域链以获取对 myWidget
的引用.
如果我们使用这个 definition of closures here :
A closure is a combination of a code block and data of
a context in which this code block is created.
或者 mozilla definition :
Closures are functions that refer to independent (free) variables. In other words,
the function defined in the closure 'remembers' the environment in which it was created.
执行myWidget.init()
里面的代码块时您正在使用闭包来引用 myWidget
在通话中 myWidget.left()
和 myWidget.right()
当你携带 myWidget
您的上下文/环境中的变量(而不是在 init()
函数中本地查找它)。
换句话说,当你执行myWidget.init()
发生以下情况:
- 是
myWidget
当前function()
中的局部变量? 否 - 移至父范围(即 GLOBAL)
- 是
myWidget
当前(即 GLOBAL)范围内的变量? YES --> 闭包使用 - 好的,用这个
myWidget
检索变量的引用。
我从来没有想过全局范围内的闭包,但是范围链一直延伸到 GLOBAL 是完全合理的,它只是充当另一个 function() {}
代码块包装了所有内容,是找到我们所追求的变量的最终来源,这是另一篇支持这种观点的文章:
http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/
关于javascript - 这是否符合 Javascript 闭包的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16433387/