如何直接在scala.js中嵌入javascript代码?

Fre*_*ind 10 javascript scala.js

当我使用scala.js编写scala代码来生成javascript时,我发现有时很难将第三方javascript代码包装到scala对象中.

反正有没有直接嵌入一些JavaScript代码?例如作为字符串?

sjr*_*jrd 16

不,故意没有.例如,"嵌入式"JavaScript代码中的标识符如何绑定到周围Scala.js代码中的标识符?这永远不会有任何意义.

丑陋的解决方法: js.eval

js.eval显然,您可以将JavaScript代码"嵌入"作为参数.

import scala.scalajs.js

def foo(x: Int): Unit =
  js.eval("console.error('hello');")
Run Code Online (Sandbox Code Playgroud)

但是js.eval总是在全局范围内进行求值(不在你调用它的范围内),所以这不起作用:

def foo(x: Int): Unit =
  js.eval("console.error(x);") // x undefined here
Run Code Online (Sandbox Code Playgroud)

好的解决方案: js.Dynamic

虽然您无法在Scala.js代码中嵌入任意JavaScript代码,但您可以使用js.Dynamicjs.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)
Run Code Online (Sandbox Code Playgroud)

你甚至可以编写疯狂的JavaScript-ish代码:

if (g.console)
  (g.console.error || g.console.log).call(g.console, x)
Run Code Online (Sandbox Code Playgroud)

例如,如果你想要坚强consoleconsole.error不存在.

这种方法的优点是标识符的正常绑定规则.而且您不必使用字符串来完成工作.