1

这是我目前的代码(显然删除了不必要的元素):

var foo = new Array();
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function()
{
    if (xhr.readyState == 4 && xhr.status == 200)
    {
        foo[0] = eval("(" + xhr.responseText + ")");
        // After this point, I want to be able to reference 
        // foo[0].bar1
        // and 
        // foo[0].bar2()
    }
}
xhr.open("GET", "myfunc.js", true);
xhr.send();

这是 的内容myfunc.js,但它不起作用。

function() {
    this.bar1 = "Hello World";
    this.bar2 = function()
    {
        console.log("this is bar2");
    };
}

这行得通,但它分配的是barandbar2foo不是foo[0]. 我怎样才能确保它分配给他们foo[0]

4

2 回答 2

0

myfunc.js包含尚未实例化的匿名 JavaScript 类(=匿名函数)。因此,在您的主脚本中,eval()仅返回该类。foo[0]现在可用于从该类实例化对象;它类似于类名。

我的意思是你试图从一个类(而不是一个对象)中获取属性,这当然是行不通的。所以你基本上有两种选择来解决这个问题:

  1. 创建由返回的匿名类的实例eval()

    foo[0] = new (eval("(" + xhr.responseText + ")"));
    console.log(foo[0].bar1);
    
  2. 从以下位置返回一个(单例)对象而不是一个类myfunc.js

    new function() {
        this.bar1 = "Hello World";
    }
    

顺便说一句,在我看来,昆汀说你应该重新考虑你的程序的结构是有道理的......

于 2012-10-08T22:09:57.333 回答
0

我最终使用 JSON(正如 Quentin 建议的那样)而不是定义一个自我修改函数。我生成的myfunc.json文件如下所示:

{
    "bar1": "Hello World",
    "bar2": function()
    {
        console.log("this is bar2");
    }
}

至于结构,我并不太在意。它仅在 LAN 上运行,旨在展示我对 WebGL 的想法,而不是作为一款实用的、完全完成的游戏。

于 2012-10-10T06:24:10.853 回答