如果名称通过JSON传递,如何访问内存中变量?

时间:2014-02-11 06:31:18

标签: javascript json variables global-variables

看起来很简单......

如果我在JavaScript处理程序中设置它:

 var storage;

稍后我会检索一个属性的JSON字典,我想在storage上设置它。我的字典看起来像这样:

 {
   "type": "foo",
   "set_on_global": "storage",
   "property_dict": {
      "some": "thing",
      "baz": "bam"
   }
 }

问题:
有没有办法使用set_on_global在我的全局property_dict变量上设置storage对象,例如:

  storage.property_dict = {
    "some": "thing",
    "baz": "bam"
  };

谢谢!

修改
storage不是全局但只保留在内存中时,如何做到这一点?

: 所以这就是它的工作方式。它似乎只适用于setter方法,例如:

var setter = function (set_on, set) {
 switch (set_on) {
   case "storage":
     storage.property_dict = set;
     break;
 }

}

不是一个大粉丝,因为它需要硬编码“存储”,所以也许还有另一种方式。

5 个答案:

答案 0 :(得分:2)

喜欢这个?您始终可以从窗口对象访问全局变量。

window[json.set_on_global] = json.property_dict;

已编辑 - 已更新以回答跟进问题

这取决于您是否有权访问它。让我们说它是在一个类中定义的,它已暴露出来。然后你可以做同样的事情。

obj [json.set_on_global] = json.property_dict;

其中obj是该类的实例。

如果它是一个类中的私有变量,那么你需要暴露它或者有一个setter来实现这一点。

这就是你在问什么,对吧?


EDITED 2

您可以尝试在对象中存储存储空间。

var variables = {
    storage: {}
};

var setter = function(instruction){
    variables[instruction.set_on_global] = instruction.property_dict;
}

另一种方法是公开变量,这样你就可以这样(假设这是一个单例):

var Clz = function(){
    var storage = {};

    return {
         storage: storage
    }
}();

Clz[json.set_on_global] = json.property_dict;

这应解决您的硬编码问题。我不知道你想要创建什么样的课程,所以我想我给了你一个单例。

答案 1 :(得分:1)

以下是代码:

假设storage是浏览器代码中的全局变量。它可以像window.storagewindow['storage']

一样访问
var json =  {
   "type": "foo",
   "set_on_global": "storage",
   "property_dict": {
      "some": "thing",
      "baz": "bam"
   }
}

var obj = window[json.set_on_global] = {}
obj.property_dict = json.property_dict

答案 2 :(得分:1)

首先,您必须将存储定义为全局

window.storage = {};

稍后,您获得了JSON,只需覆盖它

window.storage.property_dict = {
    "some": "thing",
    "baz": "bam"
}   

答案 3 :(得分:1)

我不明白。你有全局storage,为什么你不能用它来定义它的新属性?或者你不明白如何遍历JSON对象?

答案 4 :(得分:0)

我会反对它 - 你很容易受到跨脚本攻击。 封装还会建议您的服务器端脚本不应该知道客户端脚本的内部工作,并且数据不应该对它们进行说明。

所以最好的行动方案应该是使用类似的东西:

storage = json_decode(buffer);

如果您需要数据来指示哪个全局变量应该获取数据,请使用标识符代码和开关:

"set_on_global" : 1,

    switch(buffer.set_on_global) {
      case 1:
        storage = buffer.property_dict;
    }

(在我的脑海中,sintax可能会关闭)

你将拥有你的变量集。

编辑:另一个答案提出了一个比我下面写的更好的解决方案。