JavaScript范围解决时间

时间:2014-06-10 14:35:10

标签: java javascript object scope

我正在编写一个使用rhino(或浏览器)动态加载javascript的应用程序;我有2个文件:

// in a file called fooDefinition.js
var definition = {
    foo: function(data){return bar(data)},
    loadFile: "barLib.js"
}

现在,bar()的定义如下:

// in a file called barLib.js
function bar(data){
    return data + " -> bar!";
}

这就是我想要做的事情:

  1. fooDefinition.js加载到环境中
  2. 读取loadFile的值(在本例中为"barLib.js")并加载文件(注意:通过外部机制加载文件,而不是通过javascript本身!)
  3. 致电foo
  4. 外部机制&示例用法(Java伪代码):

    // assume engine is a statefull engine (rhino for example)
    String str = /*content of fooDefinition.js*/;
    engine.eval(str);
    String fileToLoad = engine.eval("definition.loadFile");
    engine.load(IOUtils.readFileToString(new File(fileToLoad)));
    String result = engine.eval("definition.foo('myData')");
    

    我已经在Google Chrome的JS控制台中试过了这个并没有引发任何错误

    我想知道这是完成这项任务的正确方法吗?

    TL; DR: 在定义对象时是否加载了对象的属性并检查了

1 个答案:

答案 0 :(得分:1)

如果你的engine是有状态的,那就是它跟踪定义的变量,是的,你的方法是正确的并且将按预期工作
但如果不是,你的方式就会失败,因为当你打电话给下面的

String fileToLoad = engine.eval("definition.loadFile");

您的引擎没有关于definition对象的任何信息,因此它会返回异常(在JavaScript中)。

看来你的引擎是有状态的,所有东西都能正常工作