我正在努力思考类、数据可见性和闭包(特别是在 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 风格”。我只是想知道第一个例子中是否有我没有完全理解的优势或其他细微差别。如果我是正确的,那么这两个示例都会创建闭包,因为它们正在访问在它们自己的范围之外声明的数据。
最佳答案
首先,您说的两个版本都使用闭包是正确的。
第一个版本更简洁(在我看来)并且在现代 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/