使用字符串在javascript中访问变量

时间:2015-07-24 17:28:52

标签: javascript variables

如果我有:

name.sub = function() {
    var sub = {};
    var placeholder = "test"
    var test = function() {
        return 42;
    };

    // Desired code would be here

    return sub;
};

我想使用placeholder来访问变量,以便获得42

喜欢的东西 window["name"]["sub"][placeholder]似乎正在寻找name.sub.test。

我找到的唯一答案是它是否是全局变量。 使用eval会起作用,但我听说应尽可能避免使用它。

placeholder = "test"; 
console.log(eval(placeholder + '()'))
// Would return 42

我的实际目标是建立一个关联数组:

console.log(array[placeholder]);
// Would return 42

任何帮助都将不胜感激。

这是我最终用于任何感兴趣的人:

name.sub= function() {
    var sub = {};
    var placeholder = "test"
    var test = function() {
        return 42;

    var newObj = {};
    newObj["test"] = function() {test()}

    console.log(newObj[placeholder]())
    // Should return 42
    };

3 个答案:

答案 0 :(得分:1)

您无法从函数外部访问函数内的变量。

相反,你可以这样做:

name.sub = function(placeholder) {
  var functions = {
    "test": function() {
      return 42;
    },
  };
  return functions[placeholder]();
};

name.sub("test"); // 42

我不确定这是不是你正在寻找的东西,但希望它是。解释更多?

答案 1 :(得分:0)

您无法访问函数内的局部变量,就像访问全局范围内window的属性一样。

kangax撰写了一篇关于Understanding delete [in JavaScript]的有趣文章,其中包含对激活对象的解释 - 我认为这就是您正在寻找的内容。
> 我建议你阅读整篇文章,但长话短说:

内部函数,声明的变量(和函数)作为属性添加到当前作用域的激活对象,因为它们被添加到全局作用域中的window。 但不像window

  

请注意,Activation对象是一种内部机制,程序代码永远无法访问它。

结论:你所要求的不是(目前)可能。

您的选择仅限于:

  1. 使用中间对象:

    name.sub = function() {
        var sub = {};
        var placeholder = "test";
        var array = {};
        array.test = function() {
            return 42;
        };
        console.log(array[placeholder]());
        return sub;
    };
    
  2. 使用eval,完全按照您的建议:

    name.sub = function() {
        var sub = {};
        var placeholder = "test";
        var test = function() {
            return 42;
        };
        console.log(eval(placeholder + '()'));
        return sub;
    };
    
  3. 使用window,从var的声明中删除test

    name.sub = function() {
        var sub = {};
        var placeholder = "test";
        test = function() {
            return 42;
        };
        console.log(window[placeholder]());
        return sub;
    };
    
  4. 我建议第一个选项是为了超过eval的性能,与window的兼容性(可能会与其他代码冲突),仅仅是因为个人品味和我认为的良好做法。< / p>

答案 2 :(得分:0)

根据我对你的问题的理解,

看起来你正在寻找一个JavaScript对象文字的键/值对,

window.name保留为btw:https://developer.mozilla.org/en-US/docs/Web/API/Window/name

var sub = {
    'test': function() {
        return 42;
    },
    'test2': 42;
}

sub['test']();
sub['test2'];

添加

Using dot notation:
sub.test3 = "value3";

Using square bracket notation:
sub["test4"] = "value4";

也许我想简单,但似乎这就是你要找的东西