小编典典
当要在范围内将java方法(静态或非静态)用作全局函数时,我们使用以下逻辑:
FunctionObject javascriptFunction = new FunctionObject(/* String*/ javascriptFunctionName, /* Method */ javaMethod, /*Scriptable */ parentScope);
boundScope.put(javascriptFunctionName, boundScope, javascriptFunction);
在这里,boundScope应该始终是要提供该功能的范围。
但是,父作用域的值取决于我们是绑定实例方法还是静态方法。对于静态方法,可以是任何有意义的范围。甚至可以与相同boundScope。
但是在使用实例方法的情况下,parentScope应该是绑定了方法的实例。
以上只是背景信息。现在,我将说明问题所在,并给出一个自然的解决方案,即允许直接将实例方法作为全局函数调用,而不是显式创建对象的实例,然后使用该实例调用方法的解决方案。
调用函数时,Rhino将调用FunctionObject.call()传递给的引用的方法this。如果函数是全局函数,则在不引用this(即xxx()代替this.xxx())的情况下调用该函数,this传递给该FunctionObject.call()方法的变量的值就是进行调用的范围(即,在这种情况下,this参数将与参数的值相同scope)。
如果被调用的java方法是一个实例方法,这将成为一个问题,因为根据FunctionObject类的构造函数的JavaDocs :
如果该方法不是静态的,