如何在Kotlin中定义全局js函数?

时间:2019-02-10 02:12:03

标签: javascript kotlin global-variables kotlin-js-interop kotlin-js

我在KotlinJs项目中创建的每个函数和变量都进入一个模块。但是我需要在全局范围内定义一些功能。

我使用p5js库(纯js)。它允许用户在全局范围内定义事件处理功能。我正在尝试在此项目中使用KotlinJS。但是我不知道如何创建全局函数来处理p5js的事件。我所有的Kotlin功能都在模块内部。要调用我的Kotlin代码,我需要指定全名mymodule.draw()

当前,我必须使用全局函数制作一个额外的纯JS代码层,以将执行转换为如下所示的kotlin函数:

function setup() {
    mymodule.setup();
}

function draw() {
    mymodule.draw();
}

这种方法的问题是很多样板和重复的代码。

3 个答案:

答案 0 :(得分:3)

如果这对某人有用,我将在这里留下另一个解决方法:

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函数一样使用一些开箱即用的解决方案。

答案 1 :(得分:1)

不幸的是,在Kotlin / JS中无法定义全局函数。如果在全局范围内定义的模块对象中具有全局符号,则可以使用普通模块类型。

// module M
fun foo() {}

可通过M.foo

访问

答案 2 :(得分:1)

除了@Sergey的答案之外,在处理诸如p5.js之类的库时,也可以使用此解决方法

fun main() {
    window.asDynamic().setup = {
        // your setup code here
    }

    window.asDynamic().draw = {
        // your draw code here
    }
}

这种方法最小化了两个函数的定义和声明(从您的C语言着眼)。谢谢