在他的视频之一中(大约在视频的第1分25秒,由于视频倒放,它显示为-27:45),Douglas Crockford提到JavaScript闭包是巨大表现力的来源,与其他强大结构不同的是也很安全。他特别提到,在JavaScript闭包中限制作用域,使它们更加安全。
有人能给我举几个例子来展示JavaScript闭包的作用域规则如何使它们比其他具有闭包的语言更加安全吗?此外,还有其他什么因素使JavaScript闭包比其他语言中的对应物更加安全吗?
在他的视频之一中(大约在视频的第1分25秒,由于视频倒放,它显示为-27:45),Douglas Crockford提到JavaScript闭包是巨大表现力的来源,与其他强大结构不同的是也很安全。他特别提到,在JavaScript闭包中限制作用域,使它们更加安全。
有人能给我举几个例子来展示JavaScript闭包的作用域规则如何使它们比其他具有闭包的语言更加安全吗?此外,还有其他什么因素使JavaScript闭包比其他语言中的对应物更加安全吗?
从字面上理解,闭包中的变量只能被该闭包内部的代码直接访问,因此它们在某种意义上是“安全”的。我建议您阅读Jibbering Closure Notes。
任何“泄漏”的对象仍可能引入数据操作/副作用点。ECMAScript中的闭包在与具有类似闭包语义的其他语言相比并不更加“安全”--在这个意义上,“安全”意味着“私有变量访问”。另一方面,一些语言已经拥有了更受控制的成员可见性修饰符(例如Java或C#的private/public区分)。
当然,如果将仅依赖原型的JavaScript对象视为“不安全”,那么情况就不同了。(如果有人错误地使用我的代码,就让他们自生自灭吧;-)
个人认为Crockford先生是一个很好的布道者--但不是我的信仰;-) 一个人可以说出关于X的各种好话,而没有适当地分析它与Y的关系。
// 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