Javascript 闭包和数据可见性

标签 javascript closures

我正在努力思考类、数据可见性和闭包(特别是在 Javascript 中)的想法,我在类型的 jQuery 文档页面上提到闭包用于隐藏数据:

The pattern allows you to create objects with methods that operate on data that isn't visible to the outside—the very basis of object-oriented programming.

例子:

function create() {
  var counter = 0;
  return {
    increment: function() {
      counter++;
    },
    print: function() {
      console.log(counter);
    }
  }
}
var c = create();
c.increment();
c.print(); // 1

通过使用关键字 var 声明变量 counter,它已经在函数/类定义的局部范围内。据我所知,一开始就无法从外部访问它。从数据可见性的 Angular 来看,我是否遗漏了什么。

其次,像上面那样编写类与像下面这样编写类是否有优势:

function create() {
  var counter = 0;
  this.increment = function() {
      counter++;
  }
  this.print = function() {
      console.log(counter);
  }
  return this;
}
var c = create();
c.increment();
c.print(); // 1

据我了解,这些在语义上或多或少是同一件事——第一个只是更多的“jQuery 风格”。我只是想知道第一个例子中是否有我没有完全理解的优势或其他细微差别。如果我是正确的,那么这两个示例都会创建闭包,因为它们正在访问在它们自己的范围之外声明的数据。

http://docs.jquery.com/Types#Closures

最佳答案

首先,您说的两个版本都使用闭包是正确的。

第一个版本更简洁(在我看来)并且在现代 javascript 中更受欢迎。第一种风格的主要潜在缺点是您无法有效地将对象分配给构造函数的原型(prototype),如果您正在创建大量相同的对象,这将很有用(并且效率更高)。

第二种风格,我实际上从未在生产 Javascript 中见过。通常,您会使用 new 实例化 create,而不是像这样在 create() 函数中返回 this :

function create() {
  var counter = 0;
  this.increment = function() {
      counter++;
  }
  this.print = function() {
      console.log(counter);
  }
}
var c = new create();
c.increment();
c.print(); // 1

关于Javascript 闭包和数据可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/947352/

相关文章:

javascript - 阻止 webview 发出定期请求

javascript - if 条件在 ng-repeat 变量上

javascript - Material 设计中的输入没有主题

python - 闭包:什么是好的用例示例?为什么不是仿函数?它值得负面影响吗?

python - 在字典中存储 Lambda

Javascript 闭包 - 绑定(bind)值而不是引用

javascript - 加载外部 JavaScript 时显示 "Loading"消息?

javascript - 正则表达式 : Why this regex doesn't match "not starts with" two letter?

scala - Scala 中的 curry 和闭包

c# - 为什么返回 IEnumerable 的 C# 方法在返回 List 时会起作用,而在它产生时却不起作用?