有没有办法从模块模式动态访问私有变量的公共功能? 测试1显示了我的意思与“动态访问”,但与公共变量是否可以动态访问模块模式中的私有变量?
var x = (function(){
var x=0, y=2, z=5;
return {
toast: 123,
test1: function(arg){
return this[arg];
},
test2: function(){
// ??
}
};
}());
console.log(x.test1("toast")); // 123
console.log(x.test2("y")); // should return 2
我结束了创建一个私有变量(一个对象)存储我的私有变量,所以我能够访问他们这样
privateVarStore[privateVarName]
但有没有另一种解决方案呢?
为了避免安全问题,建议添加一个验证,即参数到test2确实是一个简单的变量:return/^ [$ _ a-z] [$ _ a-z0-9] * $/i.test(a)? eval(a):undefined; – HBP 2011-12-25 05:56:27
@HansBPUFAL:好主意!我一定会把它加上 – qwertymk 2011-12-25 06:10:17
+1,但是我能否提出另一种验证思路:如果你定义了一个列出哪些私有变量可以通过公共函数访问的对象,比如'var accessList = {“x” :true,“y”:true};'然后在'function test2(a)'你可以说'return accessList [a]? eval(a):undefined; - 优点是这不仅提供了可以传递给eval的字符串的安全性,还允许你定义其他真正的私有变量,这些变量不能通过'test2() 。 – nnnnnn 2011-12-25 11:55:30