繁体   English   中英

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

[英]Use string to access variable in javascript

如果我有:

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
    };

您不能从所述函数外部访问函数内部的变量。

相反,您可以这样做:

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

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

我不确定这是否是您要找的东西,但希望如此。 解释更多?

您不能以与访问全局范围内的window属性相同的方式访问函数内部的局部变量。

kangax写了一篇有趣的文章[了解JavaScript中的delete] ,其中包括对什么是激活对象的解释-我认为这是您正在寻找的对象。
我建议您阅读全文,但长话短说:

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

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

结论:您要的(当前)不可能。

您的选择仅限于:

  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 ,通过从test的声明中删除var

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

我建议使用第一个选项,是因为eval更好的性能,与window兼容性(可能与其他代码冲突),并且仅仅是出于个人喜好和我认为的良好做法。

根据我对您的问题的了解,

似乎您正在寻找JavaScript对象文字的键/值对,

保留window.name,顺便说一句: https : //developer.mozilla.org/zh-CN/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";

也许我在想简单,但似乎这就是您想要的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM