有没有办法从模块模式中动态访问私有变量的公共函数?
test1显示了我对“动态访问”的含义,但使用了公共变量
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]
但那还有另一种解决方案吗?
是。
很抱歉让Adam Rackis失望,但你可以做到( 邪恶)eval:
var x = (function(){
var x=0, y=2, z=5;
return {
toast: 123,
test1: function(arg){
return this[arg];
},
test2: function(a){
return eval(a)
}
};
}());
console.log(x.test1("toast")); // 123
console.log(x.test2("y")); // should return 2 -> does return 2
这是少数例外情况之一 eval 应该使用。
编辑,根据Hans B PUFAL建议(评论),您可以并且应该验证参数 test2 如下:
test2: function(a){
return /^[$_a-z][$_a-z0-9]*$/i.test (a) ? eval(a) : undefined;
}
是。
很抱歉让Adam Rackis失望,但你可以做到( 邪恶)eval:
var x = (function(){
var x=0, y=2, z=5;
return {
toast: 123,
test1: function(arg){
return this[arg];
},
test2: function(a){
return eval(a)
}
};
}());
console.log(x.test1("toast")); // 123
console.log(x.test2("y")); // should return 2 -> does return 2
这是少数例外情况之一 eval 应该使用。
编辑,根据Hans B PUFAL建议(评论),您可以并且应该验证参数 test2 如下:
test2: function(a){
return /^[$_a-z][$_a-z0-9]*$/i.test (a) ? eval(a) : undefined;
}
没有 (至少不是没有诉诸 eval,根据qwertymk的回答)。
y 不属于 x (考虑将这个对象命名为比 x 避免与局部变量混淆 x)。 y 是一个局部变量 x的方法形成了封闭。
任何 x的方法可以访问 y,但不是说 this.y而是通过访问 y 直。
再次, y 不是您对象的属性 x。它只是创建的函数中的局部变量 x从而导致 x形成封闭的方法。
所以,得到 test2 回来 y, 做就是了:
test2: function(){
return y;
}
要创建允许您访问私有变量的方法,请考虑以下内容:
var x = (function () {
var privateMembers = { x: 0, y: 2, z: 5 };
return {
getPrivate: function (name) {
return privateMembers[name];
},
toast: 123,
test1: function (arg) {
return this[arg];
},
test2: function () {
// ??
}
};
})();
接着
alert(x.getPrivate("y")); //alerts 2
查看 这个小提琴