首页 > 解决方案 > 为什么在使用箭头函数时我无法在 Swift 中通过 JSContext 获取函数引用

问题描述

我正在尝试在 Swift 中获取 JavaScript 函数引用并执行它。

最初,我在 JS 端使用箭头函数,我的 JavaScript 函数是这样的。

const invokeCallback = (cbID, args) => {   
    // do some stuff
}

在 Swift 方面,我使用objectForKeyedSubscriptinJSContent来获取invokeCallback上下文全局对象中的属性。

    context?.evaluateScript(jsCodeContent)
    let invoke: JSValue? = context?.objectForKeyedSubscript("invokeCallback")
    
    guard let invokeCallback = invoke else { return }
    guard !invokeCallback.isUndefined else { return }
        
    invokeCallback.call(withArguments: [cbId, args])

但我不能结果是结果是undefined

Printing description of invoke:
▿ Optional<JSValue>
  - some : undefined

然后,我尝试使用这种语法来定义function.

function invokeCallback(cbID, args) {
}

我现在可以在 Swift 端检索函数

Printing description of invokeCallback:
function invokeCallback(cbID, args) {
   // ....
}

有人知道为什么第一种情况不起作用,而第二种情况起作用吗?请把这些知识分享给我?谢谢

参考:

标签: javascriptswiftjavascriptcore

解决方案


问题不在于箭头函数,而在于您声明函数的方式。

在全局上下文中使用函数声明声明的函数成为全局对象的一部分。

在全局上下文中声明的变量var也成为全局对象的一部分。在这种情况下,您是否分配(箭头)函数表达式或任何其他值都没有关系。

const在全局上下文中声明的变量不会成为全局对象的一部分

因为您的箭头函数被分配给用 声明的变量const,所以它不是全局对象的一部分,因此您找不到它。如果您希望您的函数成为全局对象的一部分,您应该使用函数声明,使用 声明变量var,或者将其直接分配给全局对象。

globalThis.invokeCallback = () => {...};

还值得注意的是,箭头函数和正则函数表达式(不要与函数声明混淆并不总是可以互换的。


推荐阅读