1

我一直在想——JavaScript 闭包可以用来做什么?

我知道如何编写它们,也知道它们是如何工作的,但我就是不知道如何使用它们。

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

到目前为止,我只发现了它们的一种用途——封装数据,因此它在函数之外是不可见的。

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

任何澄清都非常感谢!

4

2 回答 2

1

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

(function($){ //use $ safely inside the closure })
(jQuery);
于 2013-03-28T04:00:38.033 回答
1

就个人而言,除了封装或创建私有上下文等显而易见的事情外,我喜欢单例 JavaScript 设计模式:

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 模式一书中找到了它。检查一下,因为还有其他有用的设计模式和闭包应用程序示例。根据这本书:

You can use closure to store some private data, which is accessible by the returned function but not to the outside code.
于 2013-03-28T04:07:27.963 回答