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

使用字符串访问javascript中的变量,javascript,variables,Javascript,Variables,如果我有: name.sub = function() { var sub = {}; var placeholder = "test" var test = function() { return 42; }; // Desired code would be here return sub; }; 我想使用一个占位符来访问变量,以便得到42 差不多 window[“name”][“sub”][占位符]似乎在寻找name.s

如果我有:

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

    // Desired code would be here

    return sub;
};
我想使用一个
占位符
来访问变量,以便得到
42

差不多
window[“name”][“sub”][占位符]
似乎在寻找name.sub.test

我找到的唯一答案是它是否是一个全局变量。 使用eval是可行的,但我听说应该尽可能避免使用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
    };

不能从函数外部访问函数内部的变量

相反,您可以这样做:

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

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

我不确定这是否是你想要的,但希望是。详细说明?

您不能像访问全局范围内的
窗口的属性那样访问函数中的局部变量

写了一篇关于的有趣文章,其中包括对激活对象是什么的解释,我认为这就是您正在寻找的对象。
我建议你通读整篇文章,但长话短说:

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

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

结论:你所问的(目前)是不可能的

placeholder = "test"; 
console.log(eval(placeholder + '()'))
// Would return 42
您的选择仅限于:

  • 使用中间对象:

    name.sub = function() {
        var sub = {};
        var placeholder = "test";
        var array = {};
        array.test = function() {
            return 42;
        };
        console.log(array[placeholder]());
        return sub;
    };
    
  • 使用eval,就像您建议的那样:

    name.sub = function() {
        var sub = {};
        var placeholder = "test";
        var test = function() {
            return 42;
        };
        console.log(eval(placeholder + '()'));
        return sub;
    };
    
  • 使用
    窗口
    ,从
    测试
    的声明中删除
    变量

    name.sub = function() {
        var sub = {};
        var placeholder = "test";
        test = function() {
            return 42;
        };
        console.log(window[placeholder]());
        return sub;
    };
    

  • 我建议第一个选择是为了性能优于<代码> EVA/code >,以兼容<代码>窗口(可能与其他代码冲突),仅仅是因为个人品味和我认为良好的实践。

    < P>通过我对您的问题的理解,

    看起来您正在寻找JavaScript对象文本的键/值对

    window.name是保留的,顺便说一句:

    加上

    Using dot notation:
    sub.test3 = "value3";
    
    Using square bracket notation:
    sub["test4"] = "value4";
    

    也许我觉得很简单,但似乎这就是你要找的

    你试过
    窗口[“名称”][“子”][窗口[“名称”][“子”][“占位符”]]]()
    ?我不太明白这个目的。您不能访问函数外部函数的本地“占位符”。您必须在函数外部定义占位符,或将占位符添加为返回对象的属性;在保持上下文的同时,我可能在将问题抽象化方面做得很差。将有一个
    name.sub.input(variable)
    ,其中
    input
    variable
    转换为字符串(例如
    “test”
    )。我想知道变量
    test
    等于什么。希望这能让事情变得明朗一点。尽管我认为我为什么要这样做是个白痴。我能问一个半跟进的问题吗,因为也许我问错了。我正在尝试做一个gui,在这里单击一个项目,然后该项目将运行一个函数。因此,我在项中有一个属性,该属性具有单击时应运行的函数的名称。所以基本上我想在画布上创建一个onClick函数,如果这有意义的话。上面的这个实现仍然相关吗?我不给该项分配属性,而是给它分配函数本身——如果它是DOM元素,则通过
    addEventListener
    ,否则通过属性。但是关于你具体情况的细节,我建议你问一个新问题。谢谢,但我试着让一切都在功能范围内。基本上是基于字符串的值动态调用函数。