javascript - 这是否符合 Javascript 闭包的条件?

标签 javascript closures

我刚开始学习 JS 中的闭包,有人告诉我,我实际上已经编写了闭包,但没有意识到它们是闭包。我以为这只是一个单例对象/类,但他认为这是一个闭包:

var myWidget = {
    counter : 0,
    init : function() {
        myWidget.left();
        myWidget.right();
    },
    left : function() {
        // whatever
    },
    right : function() {
        // whatever
    }
}
myWidget.init();

这是闭包吗?如果不是,那是什么?

最佳答案

是的,确实如此。

在该代码示例中,您是:

  1. 定义一个具有某些属性的普通对象
  2. 在其中一个属性(函数)内使用闭包来引用您刚刚定义的对象。

我可以看出您是否在定义 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()发生以下情况:

  1. myWidget当前 function() 中的局部变量?
  2. 移至父范围(即 GLOBAL)
  3. myWidget当前(即 GLOBAL)范围内的变量? YES --> 闭包使用
  4. 好的,用这个 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/

相关文章:

Javascript 浏览器乱序执行代码

php - 我如何像在 Ruby 中使用 block 一样使用 PHP 5.3 闭包

methods - 在 Groovy 中设置 MethodClosure 的委托(delegate)

javascript 检查结束日期是否大于或等于开始日期

JavaScript "\8"文字

javascript - 三个 Js 在 Y 轴上旋转网格以面向特定矢量位置

ios - 如何在 Swift4 中返回受线程影响的值

ios - 在 dispatch_async 中正确引用 self

javascript - 如何链接本地 PDF 文件中的页面?

javascript - Canvas 到图像 src 上的 base64