什么可以使用javascript闭包?

时间:2013-03-28 03:47:53

标签: javascript closures

我一直想知道 - JavaScript闭包可用于什么?

我知道怎么写它们,我知道它们是如何工作的,但我无法理解如何使用它们。

function closure() {
  var name = "John";
  function displayName() {
    return 'Hello, ' + name;
  }
  return displayName;
}

到目前为止,我只发现了一种用途 - 封装数据,因此在函数外部不可见。

但他们还能用什么呢?我应该用闭包写OOP吗?我是否需要将所有代码放在一个闭包中,以免它影响全局范围?

任何澄清都非常感谢!

2 个答案:

答案 0 :(得分:1)

还可以用来保护colsure中的代码,防止闭包之外的不同库之间的命名冲突。每当我创建一个JQuery插件时,我创建它作为一个自调用闭包我传递给“JQuery”,但由于我的函数定义中的命名$变量的本地范围,可以安全地引用闭包里面的$。即使有其他库使用$变量用于不同的目的

(function($){ //use $ safely inside the closure })
(jQuery);

答案 1 :(得分:1)

就个人而言,除了封装或创建私有上下文这些明显的东西之外,我喜欢Singleton JavaScript Design Pattern:

function Singleton() {
    // cached instance
    var instance = this;

    //proceed as normal - adding some variables
    this.variable1 = 1000;
    this.variable2 = 3000000;

    Singleton = function() {
        return instance;
    }
}

var singleton1 = new Singleton();
var singleton2 = new Singleton();

if(singleton1 === singleton2) {
    console.log("Singleton works :)");
}
else {
    console.log("Singleton doesn't work :/");
}

您可以将此代码直接粘贴到Chrome JavaScript控制台中。

当然,您可以调整它以满足您的需求。还有一些缺点 - 您可以覆盖Singleton函数,并且您将无法再访问实例。但这是另一个问题。

我很久以前在Stoyan Stefanov(O'Reilly)的JavaScript Patterns中找到了它 。检查一下,因为还有其他有用的设计模式和闭包应用示例。根据这本书:

You can use closure to store some private data, which is accessible by the returned function but not to the outside code.