为什么JavaScript闭包被称为安全的?

7

在他的视频之一中(大约在视频的第1分25秒,由于视频倒放,它显示为-27:45),Douglas Crockford提到JavaScript闭包是巨大表现力的来源,与其他强大结构不同的是也很安全。他特别提到,在JavaScript闭包中限制作用域,使它们更加安全。

有人能给我举几个例子来展示JavaScript闭包的作用域规则如何使它们比其他具有闭包的语言更加安全吗?此外,还有其他什么因素使JavaScript闭包比其他语言中的对应物更加安全吗?


适合在http://programmers.stackexchange.com上提问的好问题... - Nicole
2个回答

10

从字面上理解,闭包中的变量只能被该闭包内部的代码直接访问,因此它们在某种意义上是“安全”的。我建议您阅读Jibbering Closure Notes

任何“泄漏”的对象仍可能引入数据操作/副作用点。ECMAScript中的闭包在与具有类似闭包语义的其他语言相比并不更加“安全”--在这个意义上,“安全”意味着“私有变量访问”。另一方面,一些语言已经拥有了更受控制的成员可见性修饰符(例如Java或C#的private/public区分)。

当然,如果将仅依赖原型的JavaScript对象视为“不安全”,那么情况就不同了。(如果有人错误地使用我的代码,就让他们自生自灭吧;-)

个人认为Crockford先生是一个很好的布道者--但不是我的信仰;-) 一个人可以说出关于X的各种好话,而没有适当地分析它与Y的关系。


1
赞同。喜欢阅读道格拉斯的东西,但不会完全采纳他的建议。他太过于纯粹主义了。我会在私有原型属性前加下划线,如果有人选择篡改它,那就自己承担后果。但至少他们可以让它做他们想要的事情。而在“安全”的语言中,如果库出现问题,你必须等待库编写者修复它。 - Ruan Mendes
“private”修饰符在像C#和Java这样的语言中可能是安全的,因为虚拟机可以提供此安全性。然而,在C++中,很容易访问对象的“private”数据,例如使用“reinterpret_cast”。 - Ron Inbar

3
闭包能够封装数据,这在面向对象设计中是很有必要的。有效定义“私有”变量和发布“公有”接口可以降低程序员错误使用对象的可能性——即直接改变数据值并产生意外副作用的可能性。
// returns an object that does not itself possess "var a"
// The closure gives indirect access to a, via the public getter and setter.
function f() {
   var a = 1;

   return {
      getA: function() {
         return a;
      },
      setA: function( A ) {
         a = A;
      }
   };
}

var MyObj = new f();

alert(MyObj.a); // --> undefined
alert(MyObj.getA()); // --> 1

MyObj.setA(5);
alert(MyObj.getA()); // --> 5

例子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接