0
public class Thing {
  public Thing() {
  }

  public void run() {
  }

  public void out(String s) {
    System.out.println(s);
  }
}

Context context = Context.create("js");
Value jsBindings = context.getBindings("js");

jsBindings.putMember("this", new Thing());
context.eval("js", "this.run = () => this.out('hi');");
jsBindings.getMember("this").getMember("run").execute();

context.close();

我期待输出hi,但我没有输出。

我想知道 javascript (部分) 是否没有更新我提供context.eval的主机对象 ( )。new Thing()

4

1 回答 1

2

这里有两个问题:

  1. putMember("this", new Thing())不会修改全局,而是this在全局对象中放置一个名为的属性this,可以通过this.this. 恐怕“我如何设置全局 this”的答案是:你不能。

  2. 分配给宿主(即Java)对象方法是不可能的。但是,您可以使用 JS 对象来实现 Java 接口Value.as(Class),例如,您可以执行以下操作:

public interface Thing {
  void run();
}
Context context = Context.create("js");
Value jsobj = context.eval("js", "({run: () => console.log('hi')})");
Thing javaobj = jsobj.as(Thing.class);
javaobj.run();
于 2019-01-28T12:17:02.007 回答