javascript - 为什么在使用箭头函数时我无法在 Swift 中通过 JSContext 获取函数引用
问题描述
我正在尝试在 Swift 中获取 JavaScript 函数引用并执行它。
最初,我在 JS 端使用箭头函数,我的 JavaScript 函数是这样的。
const invokeCallback = (cbID, args) => {
// do some stuff
}
在 Swift 方面,我使用objectForKeyedSubscript
inJSContent
来获取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) {
// ....
}
有人知道为什么第一种情况不起作用,而第二种情况起作用吗?请把这些知识分享给我?谢谢
参考:
解决方案
问题不在于箭头函数,而在于您声明函数的方式。
在全局上下文中使用函数声明声明的函数成为全局对象的一部分。
在全局上下文中声明的变量var
也成为全局对象的一部分。在这种情况下,您是否分配(箭头)函数表达式或任何其他值都没有关系。
const
在全局上下文中声明的变量不会成为全局对象的一部分。
因为您的箭头函数被分配给用 声明的变量const
,所以它不是全局对象的一部分,因此您找不到它。如果您希望您的函数成为全局对象的一部分,您应该使用函数声明,使用 声明变量var
,或者将其直接分配给全局对象。
globalThis.invokeCallback = () => {...};
推荐阅读
- stata - 如何将一个变量的内容替换为另一个变量的内容?
- node.js - 使用带有 NestJS 的 aws 加密库的“EC2 元数据角色名称请求返回错误”
- flutter - Flutter:如何创建并公开图片到公共下载文件夹?
- sql - SQL Group By 不同列上的多个值
- javascript - 如何仅旋转 div 内的内容?
- .net - foreach Azure.Pageable
然后抛出 System.FormatException - python - 使用 FORMDATA 的 scrapy 问题使用凭据抓取网站
- angular - 如何在单元测试中将事件对象传递给 triggerEventHandler?
- python - 如何使用 python 从目录中检测和分离损坏/不可读的 PDF 和受密码保护的 PDF?
- node.js - 配置 SharePoint 框架