【问题标题】:How to embed javascript code directly in scala.js?如何将javascript代码直接嵌入scala.js?
【发布时间】:2015-04-23 17:41:15
【问题描述】:

当我使用 scala.js 编写 scala 代码来生成 javascript 时,我发现有时很难将 3rd-party javascript 代码包装到 scala 对象中。

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

【问题讨论】:

    标签: javascript scala.js


    【解决方案1】:

    不,没有,故意的。例如,“嵌入式”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.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)
    

    您甚至可以像这样编写疯狂的 JavaScript 式代码:

    if (g.console)
      (g.console.error || g.console.log).call(g.console, x)
    

    例如,如果您想对不存在的consoleconsole.error 保持稳健。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 2012-05-18
      • 2014-05-02
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多