如何在匿名函数/闭包内动态访问变量?

时间:2011-02-05 13:32:49

标签: javascript closures dynamic-variables

为了保持全局命名空间的清洁,我的JavaScript代码包含如下:

(function() {
    /* my code */
})();

现在我在此范围内声明了一些我想使用变量名称访问的变量(例如,名称为'something' + someVar)。 在全球范围内,我只使用window['varname'],但显然这不起作用。

有没有一个好方法可以做我想要的?如果不是,我可以简单地将这些变量放在对象中以使用数组表示法......

注意:eval('varname')不是可接受的解决方案。所以请不要建议。

3 个答案:

答案 0 :(得分:8)

这是一个很好的问题,因为this没有指向匿名函数,否则你显然只会使用this['something'+someVar]。即使使用已弃用的arguments.callee也不起作用,因为内部变量不是函数的属性。我认为您必须通过创建持有者对象来完成您所描述的内容......

(function() {
  var holder = { something1: 'one', something2: 2, something3: 'three' };

  for (var i = 1; i <= 3; i++) {
    console.log(holder['something'+i]);
  }
})();

答案 1 :(得分:2)

(function(globals) {
    /* do something */
    globals[varname] = yourvar;
})(yourglobals);

答案 2 :(得分:1)

邪恶的解决方案/黑客:将您需要的变量放在帮助程序对象 obj 中,并避免使用with(obj){将当前用途更改为点表示法您当前的代码 ...}