将函数从 Scala.js 传递到 Javascript 函数?
Pass function from Scala.js to Javascript function?
我在 Scala.js 中这样定义函数:
val myFunction: js.Function1[js.Array[String], Boolean] = (data: js.Array[String]) => true
并且还在页面上定义了Javascript函数:
function callFunction(inputFunction){
console.log(inputFunction(["10"]))
}
当我从 Scala.js 拨打电话时:
GlobalScope.callFunction(myFunction)
我收到错误:
Uncaught TypeError: inputFunction is not a function
我做错了什么以及如何解决?
GlobalScope
的定义:
@JSGlobalScope
@js.native
object GlobalScope extends js.Any {
def GlobalScope.callFunction(someFunction: (js.Array[String]) => Boolean): Unit = js.native
}
GlobalScope
中callFunction
的定义有误。它要求 js.Array[String] => Boolean
,这是一个从 js.Array[String]
到 Boolean
的 Scala 函数,而不是 JavaScript 函数。当你调用它时,即使你给它一个 js.Function1[js.Array[String], Boolean]
(这是正确的),Scala 类型系统也会插入一个从 js.Function1
到 scala.Function1
的隐式转换以符合预期的类型。但是当然 callFunction
中的 JavaScript 代码接收到一个 Scala 函数并且对它不满意。
解决办法是修正callFunction
的定义,取一个js.Function1
:
@JSGlobalScope
@js.native
object GlobalScope extends js.Any {
def callFunction(someFunction: js.Function1[js.Array[String], Boolean]): Unit = js.native
}
我在 Scala.js 中这样定义函数:
val myFunction: js.Function1[js.Array[String], Boolean] = (data: js.Array[String]) => true
并且还在页面上定义了Javascript函数:
function callFunction(inputFunction){
console.log(inputFunction(["10"]))
}
当我从 Scala.js 拨打电话时:
GlobalScope.callFunction(myFunction)
我收到错误:
Uncaught TypeError: inputFunction is not a function
我做错了什么以及如何解决?
GlobalScope
的定义:
@JSGlobalScope
@js.native
object GlobalScope extends js.Any {
def GlobalScope.callFunction(someFunction: (js.Array[String]) => Boolean): Unit = js.native
}
GlobalScope
中callFunction
的定义有误。它要求 js.Array[String] => Boolean
,这是一个从 js.Array[String]
到 Boolean
的 Scala 函数,而不是 JavaScript 函数。当你调用它时,即使你给它一个 js.Function1[js.Array[String], Boolean]
(这是正确的),Scala 类型系统也会插入一个从 js.Function1
到 scala.Function1
的隐式转换以符合预期的类型。但是当然 callFunction
中的 JavaScript 代码接收到一个 Scala 函数并且对它不满意。
解决办法是修正callFunction
的定义,取一个js.Function1
:
@JSGlobalScope
@js.native
object GlobalScope extends js.Any {
def callFunction(someFunction: js.Function1[js.Array[String], Boolean]): Unit = js.native
}