【问题标题】:JavaScript scope resolve timeJavaScript 作用域解析时间
【发布时间】:2014-07-31 09:05:33
【问题描述】:

我正在编写一个使用 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

外部机制&示例用法(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')");

我已经在谷歌浏览器的 JS 控制台中尝试过了,没有抛出任何错误

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

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

【问题讨论】:

  • 范围在调用时解析。
  • “通过外部机制加载文件,而不是通过 javascript 本身!”是什么意思?它是纯 javascript,还是 HTML 网页中的 javascript?
  • 基本上,我将通过 Java 手动加载 javascript
  • @NiettheDarkAbsol 我的用法有效吗?
  • 您的engine 状态是否完整?我的意思是,它是否跟踪定义的变量?如果是这样,如果您使用engine.eval("definition.foo('myData')");,您的方式似乎是正确的

标签: java javascript object scope


【解决方案1】:

如果您的 engine 是有状态的,即它跟踪定义的变量,是的,您的方法是正确的,并且会按预期工作
但如果不是,您的方式将失败,因为当您调用以下内容时

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

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

看来你的引擎是有状态的,一切都会正常工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多