如何检查一个 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
我正在使用 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
[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