gpt4 book ai didi

javascript - 将对象的成员函数公开为全局函数

转载 作者:行者123 更新时间:2023-11-30 08:41:13 25 4
gpt4 key购买 nike

例如我有:

var n = {
abc: function() { print("abc"); },
def: function() { print("def"); },
};

有没有办法将 abcdef 导出为全局函数,这样我就可以直接调用 abc() 而不是 n.abc()?

我的上下文是使用 Rhino/Nashorn 脚本引擎,我想注入(inject)一个提供全局函数的“全局”对象。

最佳答案

Rhino 和 Nashorn 的答案会有所不同。

对于 Rhino,当您使用 Context.initStandardObjects 创建全局对象时,您可以通过调用 ScriptableObject.defineProperty 在 Java 端添加您的属性(参见 Rhino API )然后属性将被添加到该全局范围。如果您需要 function 类型的属性,如您的示例所示,请使用 FunctionObject API 创建它。

对于 Nashorn,您可以使用主要基于标准 javax.script API 的接口(interface),以及一些特定于 Nashorn 的扩展。评估脚本时,首先使用 ScriptEngine.createBindings() 创建一个 Bindings 对象,然后使用 Bindings.put 来使用 eval(String/Reader,Bindings)

如果你需要一个函数属性,然后在 Java 端调用 ScriptUtils.wrap 来创建一个 ScriptObjectMirror(确保将它转换成那个;方法的返回类型是 Object), 然后调用 get([function name]) 获取可执行函数属性,然后将其放入全局范围。

综上所述,在我看来,使用以下脚本在脚本端更容易处理:

var abc = function() { return n.abc.apply(n,arguments); };

这可以跨 Rhino/Nashorn 移植,并且是一行,如果您想避免编写那一行,这比您将要做的工作要少得多。

如果您在全局范围内执行它,则不需要限定符;它将作为属性添加到顶级对象。如果你想更明确,你可以这样做:

(function() {
var global = this; // inner functions called without target default to global as 'this'
this.abc = function() { return n.abc.apply(n,arguments); };
})();

...除非您开始做一些更奇特的事情(比如在加载脚本时弄乱“this”值),否则它会起作用。

关于javascript - 将对象的成员函数公开为全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com