【问题标题】:Why I can't get function reference by JSContext in Swift when using Arrow function为什么我在使用箭头函数时无法在 Swift 中通过 JSContext 获取函数引用
【发布时间】:2026-02-20 14:25:01
【问题描述】:

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

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

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

在 Swift 方面,我使用JSContent 中的objectForKeyedSubscript 来获取上下文全局对象中的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) {
   // ....
}

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

参考:

【问题讨论】:

    标签: javascript swift javascriptcore


    【解决方案1】:

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

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

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

    在全局上下文do not become part of the global object 中使用const 声明的变量。

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

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

    另外值得注意的是箭头函数和正则函数表达式(not to be confused with function declarations)are not always interchangeable

    【讨论】: