首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个nashorn JavaScript ScriptEngines之间共享ScriptEngines数组和对象

在多个nashorn JavaScript ScriptEngines之间共享ScriptEngines数组和对象
EN

Stack Overflow用户
提问于 2014-09-08 01:01:37
回答 1查看 1.1K关注 0票数 1

我对nashorn有一个问题,我不太明白原生构造函数是如何工作的(对象、数组等)。

我的问题涉及一个应用程序的整个生命周期中的几个ScriptEngines,其中一些可以创建函数。

我尝试在新的ScriptEngines中使用这些函数,问题是我无法检查对象是否为给定类型(数组实例),因为该数组不是由该实例的数组构造函数生成的。

下面是一个复制它的测试:

代码语言:javascript
复制
def "Just testing"() {                                                                                                                                      
when:                                                                                                                                                     
  def manager = new ScriptEngineManager()                                                                                                                 
  def engine1 = manager.getEngineByName("nashorn")                                                                                                        
  def engine2 = manager.getEngineByName("nashorn")                                                                                                                

  def arrImpl = engine1.eval("[]")                                                                                                                        

  engine2.context.setAttribute("arr", arrImpl, ScriptContext.ENGINE_SCOPE)                                                                                

  def val = engine2.eval("arr instanceof Array")                                                                                                          

then:                                                                                                                                                     
  val == true                                                                                                                                             

}

我读了这篇文章https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes,并试图这样解决它,但仍然没有运气。

代码语言:javascript
复制
def "Just testing"() {                                                                                                                                      
when:                                                                                                                                                     
  def manager = new ScriptEngineManager()                                                                                                                 
  def engine1 = manager.getEngineByName("nashorn")                                                                                                        
  def engine2 = manager.getEngineByName("nashorn")                                                                                                        

  def context = new SimpleScriptContext()                                                                                                                 
  def bindings = engine1.getContext().getBindings(ScriptContext.ENGINE_SCOPE)                                                                             
  context.setBindings(bindings, ScriptContext.ENGINE_SCOPE)                                                                                                              

  def arrImpl = engine1.eval("[]")                                                                                                                        


  context.setAttribute("arr", arrImpl, ScriptContext.ENGINE_SCOPE)                                                                                        
  def val = engine2.eval("arr instanceof Array", context)                                                                                                 

then:                                                                                                                                                     
  val == true                                                                                                                                             

}

你知道如何使它起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-12 12:26:32

每个引擎的ENGINE_SCOPE绑定都与Nashorn全局范围对象相关联。"Array“、"Object”等是在全局范围内定义的JS内置构造函数。因此,这样的构造函数在不同的全局范围内是不同的。因此,您不能将来自另一个全局范围的对象与"instanceof“进行比较。但是由于智能dynalink的链接,nashorn仍然允许您访问此类“跨全局”对象的属性。例如,您可以访问"length“属性、使用常规属性/元素访问、方法调用语法在另一个引擎中运行的脚本中的数组元素。希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25716161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档