为什么Javascript闭包称为安全

时间:2011-02-14 05:12:40

标签: javascript closures

在他的一个videos中(大约1分25秒。视频中的时钟倒退,所以它在-27:45),Douglas Crockford提到Javascript关闭是巨大表现力的源泉与其他动力结构不同,它也是安全的。他特别提到在Javascript闭包约束范围内,这使得它们更安全。

有人可以通过一些示例来帮助我,这些示例展示了Javascript闭包的范围规则如何使它们比具有闭包的其他语言更安全。还有什么其他的东西使Javascript闭包比其他语言的同行更安全吗?

2 个答案:

答案 0 :(得分:9)

它们是“安全的”,因为只有闭包的词法范围内可以直接访问闭包函数范围的变量。我建议一般阅读Jibbering Closure Notes

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

当然,如果人们认为“仅仅”依赖于原型的JavaScript对象是“不安全的”。 (如果有人错误地使用了我的代码,请让他们 - 如果它打破了,让他们烧掉; - )

就我个人而言,我发现克罗克福德先生是一位优秀的传道者 - 但不是因为我的宗教;-)如果没有与Y的关系进行适当的分析,可以说X的各种好事。

答案 1 :(得分:3)

Closures使您能够封装(隐藏)数据,这是面向对象设计所需要的。

有效定义“私有”变量并发布“公共”界面的能力使得程序员滥用对象的可能性降低 - 即直接混淆数据值并产生意外的副作用。

// 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

EXAMPLE