如何在scala.js中直接嵌入javascript代码?
How to embed javascript code directly in scala.js?
当我使用 scala.js 编写 scala 代码生成 javascript 时,我发现有时很难将第 3 方 javascript 代码包装到 scala 对象中。
有没有办法直接嵌入一些javascript代码?例如作为字符串?
不,不是故意的。例如,"embedded" JavaScript 代码中的标识符如何绑定到周围 Scala.js 代码中的标识符?那永远没有任何意义。
丑陋的解决方法:js.eval
显然,您可以 "embed" JavaScript 代码作为 js.eval
函数的参数。
import scala.scalajs.js
def foo(x: Int): Unit =
js.eval("console.error('hello');")
但是js.eval
总是在全局范围内计算(而不是在你调用它的范围内),所以这不起作用:
def foo(x: Int): Unit =
js.eval("console.error(x);") // x undefined here
好的解决方案:js.Dynamic
尽管您不能在 Scala.js 代码中嵌入任意 JavaScript 代码,但您可以使用 js.Dynamic
and js.DynamicImplicits
。有了这些,您通常可以使用 "JavaScript semantics":
将 JavaScript 代码直接音译为 Scala 语法(非常接近 JS 语法)
import scala.scalajs.js
import js.DynamicImplicits._
import js.Dynamic.{global => g}
def foo(x: Int): Unit =
g.console.error(x)
您甚至可以像这样编写疯狂的 JavaScript-ish 代码:
if (g.console)
(g.console.error || g.console.log).call(g.console, x)
例如,如果您想针对不存在的 console
或 console.error
保持稳健。
这种方法的优点是标识符的正常绑定规则。而且您不必求助于字符串来完成工作。
当我使用 scala.js 编写 scala 代码生成 javascript 时,我发现有时很难将第 3 方 javascript 代码包装到 scala 对象中。
有没有办法直接嵌入一些javascript代码?例如作为字符串?
不,不是故意的。例如,"embedded" JavaScript 代码中的标识符如何绑定到周围 Scala.js 代码中的标识符?那永远没有任何意义。
丑陋的解决方法:js.eval
显然,您可以 "embed" JavaScript 代码作为 js.eval
函数的参数。
import scala.scalajs.js
def foo(x: Int): Unit =
js.eval("console.error('hello');")
但是js.eval
总是在全局范围内计算(而不是在你调用它的范围内),所以这不起作用:
def foo(x: Int): Unit =
js.eval("console.error(x);") // x undefined here
好的解决方案:js.Dynamic
尽管您不能在 Scala.js 代码中嵌入任意 JavaScript 代码,但您可以使用 js.Dynamic
and js.DynamicImplicits
。有了这些,您通常可以使用 "JavaScript semantics":
import scala.scalajs.js
import js.DynamicImplicits._
import js.Dynamic.{global => g}
def foo(x: Int): Unit =
g.console.error(x)
您甚至可以像这样编写疯狂的 JavaScript-ish 代码:
if (g.console)
(g.console.error || g.console.log).call(g.console, x)
例如,如果您想针对不存在的 console
或 console.error
保持稳健。
这种方法的优点是标识符的正常绑定规则。而且您不必求助于字符串来完成工作。