当我使用scala.js编写scala代码来生成javascript时,我发现有时很难将第三方javascript代码包装到scala对象中。
有没有直接嵌入一些javascript代码?例如作为字符串?
答案 0 :(得分:16)
不,目的还没有。嵌入式"中的标识符如何?例如,JavaScript代码绑定到周围Scala.js代码中的标识符?这永远不会有任何意义。
js.eval
你可以"嵌入" 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
和js.DynamicImplicits
。有了这些,您通常可以使用" JavaScript语义"直接将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
不存在而言是健全的。
这种方法的优点是标识符的正常绑定规则。而且你不必使用字符串来完成工作。