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 中见过。通常,您会实例化 createnew , 而不是返回 thiscreate()函数,像这样:

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 - 在没有表单的情况下使用 jQuery 和 Rails 定期 ping 服务器,更新表

javascript - 服务器端的Onclick事件HTML按钮

javascript - Javascript动态OnChange事件

gradle - 在 build.gradle 中如何提取和重用 Maven 存储库配置?

javascript - 用户脚本可以从给定域中删除 cookie 吗?

php - 将PHP Regex转换为Javascript(或有什么区别?)

循环内的 JavaScript 闭包——简单实用的示例

swift - 为什么DispatchSemaphore.wait()会阻止此完成处理程序?

rust - 被 rust 封闭生命周期所迷惑

循环内的 JavaScript 闭包——简单实用的示例