如何检查一个 JSValue 是否是一个函数

How to check if a JSValue is a function

我正在使用 JavaScriptCore 与 Objective-C 代码进行交互

JSValue 中没有 isFunction 方法,但我想检查一个 JSValue 是否是一个 JS 函数并从 Objective-C

中调用它

似乎无法检查。你只能检查你的函数是一个对象(在 JS 中函数是对象)。

根据文档,如果值不能被视为 JavaScript 函数,则 -[JSValue callWithArguments:] returns nil。如果 JS 函数没有显式 return 一个值,那么它隐式 return 是 JavaScript 值 undefined。所以,看起来你可以简单地尝试调用 JS 函数并处理 returns nil.

的情况

我最终向 return typeof

的结果中注入了一小段 javascript 代码
[context evaluateScript:@"function is(obj){ return typeof obj }"];
JSValue *is = [[context globalObject] valueForProperty:@"is"];
JSValue *type = [is callWithArguments:@[ is ]];

不创建任何全局对象的单行代码:

// evaluates to true if value is a function, false otherwise
[[value.context evaluateScript:@"(obj) => typeof obj === 'function'"] callWithArguments:@[value]].toBool