Javascript关闭和数据可见性

Goy*_*uix 12 javascript closures

我试图围绕类,数据可见性和闭包(特别是在Javascript)的想法,我在类型的jQuery文档页面上,它提到闭包用于隐藏数据:

该模式允许您使用方法创建对象,这些方法对外部不可见的数据进行操作 - 这是面向对象编程的基础.

这个例子:

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

通过使用关键字var声明变量计数器,它已经在函数/类定义中本地作用域.据我所知并且可以说,从外面开始无法访问.我是否从数据可见性角度遗漏了一些东西.

其次,如上所述编写课程有一个优势,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

据我所知,这些或多或少在语义上是相同的 - 第一个是更多的"jQuery风格".我只是想知道从第一个例子中我是否有一个优势或其他细微差别.如果我是正确的,两个示例都会创建闭包,因为它们访问在自己的范围之外声明的数据.

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

Tri*_*ych 10

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

第一个版本更清晰(在我看来),在现代javascript中更受欢迎.第一种风格的主要潜在缺点是你不能有效地将对象分配给构造函数的原型,如果你要创建许多相同的对象,这是有用的(并且更有效).

第二种风格,我实际上从未见过生产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
Run Code Online (Sandbox Code Playgroud)

  • Minor nit:当使用new运算符时,返回"this"相当于没有显式返回任何内容.如果没有new运算符,"this"就是当前的上下文(通常是全局的),这样你最终会破坏全局变量. (4认同)