我在KotlinJs项目中创建的每个函数和变量都进入了一个模块。但我需要在全球范围内定义一些功能。
我使用p5js库(纯js)。它允许用户在全局范围内定义事件处理函数。我正在尝试在这个项目中使用KotlinJS。但我不知道如何创建全局函数来处理p5js的事件。我所有的Kotlin函数都在模块内部。要调用我的Kotlin代码,我需要指定全名mymodule.draw()
目前,我必须使用全局函数创建一个额外的纯JS代码层,将执行转换为kotlin函数,如下所示:
function setup() {
mymodule.setup();
}
function draw() {
mymodule.draw();
}
这种方法的问题是很多样板和重复代码。
如果这对某人有用,我会在这里留下另一个解决方法:
import kotlin.browser.window
fun main() {
window.asDynamic()["setup"] = ::setup
window.asDynamic()["draw"] = ::draw
}
fun setup() {}
fun draw() {}
它实际上做了什么,它像往常一样在kotlin模块中创建函数,然后将它们分配给window对象,这使它成为全局的。
此解决方案仍然不理想,因为它需要为每个功能手动分配。至少它在Kotlin项目中是正确的,不需要维护一个单独的纯js文件。也许有可能创建一个注释并利用kotlin反射(不知道它是如何在KotlinJS中支持的)。
虽然这个解决方案适合我,但我希望有一些开箱即用的解决方案,就像它们对@JsNonModule external
功能一样。
遗憾的是,没有办法在Kotlin / JS中定义全局函数。可以使用Plain模块类型,其中您在模块对象中具有全局范围中定义的全局符号。
// module M
fun foo() {}
可以通过M.foo
访问
除了@ Sergey的答案之外,在处理像p5.js这样的库时,也可以使用这个工作
fun main() {
window.asDynamic().setup = {
// your setup code here
}
window.asDynamic().draw = {
// your draw code here
}
}
这种方法最小化了两个函数的定义和声明(看着你的C语言)。谢谢