【问题标题】:export function to global scope in scalajs在scalajs中将函数导出到全局范围
【发布时间】:2017-01-30 06:42:21
【问题描述】:

关于 scalajs 和 javascript 的问题。

如何将函数标记为纯粹导出到全局范围?

给定顶级包中的 scala 对象

@JSExport
object Foo{
 def apply(a: Int, b: Int): String = "bar"+a+b
}

我想将此 scala 代码编译成 javascript,并在全局范围内将此函数命名为 Foo。换句话说,我想有一个类似这样的 javascript:

function Foo(a,b) {
    return 'bar'+a+b;
}

是否可以使用 scalajs?

我正在用javascript编写组件,它将被第三方API引用,不受我的影响。这就是为什么我只需要遵循他们的规则并在全局范围内提供 javascript 函数。

【问题讨论】:

  • 嗯——不寻常的请求。 API 是如何工作的?它希望您传递在全局范围内定义的函数的 name 或类似的东西?
  • API 需要在全局范围内定义具有特定名称的函数的脚本,例如function anything() {...},每当发生任何事件时都会调用它。有关详细信息,请参阅docs.cycling74.com/max7/vignettes/jsbasic

标签: javascript scala scala.js


【解决方案1】:

现在的解决方案是顶级导出,如现已关闭的问题 #1381 中所述 - 要使用此功能,请使用 @JSExportTopLevel 标记对象中的函数。

object A {
  @JSExportTopLevel("foo")
  def foo(x: Int): Int = x + 1
}

<Foo will be available from JavaScript's global namespace>

(有关“导出顶级方法”下的官方文档,请参阅https://www.scala-js.org/doc/interoperability/export-to-javascript.html。)

【讨论】:

  • 请注意:您的函数必须在 object 级别内,而不是在 main 或其他函数内。
【解决方案2】:

如果不执行某些代码,您目前无法执行此操作。但是您可以使用设置代码来分配它:

import scala.scalajs.js

object App extends js.JSApp {
  def main(): Unit = {
    js.Dynamic.global.anything = // your js.FunctionN

  }
}

有一个问题 (#1381) 需要为此提供语言支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2016-05-06
    • 2016-12-10
    • 2021-06-24
    • 2017-01-20
    • 2022-01-07
    相关资源
    最近更新 更多