【问题标题】:Calling anonymous javascript function in swift using JSContext使用 JSContext 快速调用匿名 javascript 函数
【发布时间】:2015-06-17 18:13:13
【问题描述】:

我发现了如何使用 JSContext 在 swift 中调用命名的 javascript 函数。像这样:

let context = JSContext()
context.evaluateScript("function sum(a,b) { return a+b; }")
let sumFunction = context.objectForKeyedSubscript("sum")
let result = sumFunction.callWithArguments([5,3])
println("Sum = \(result.toInt32())")

但是,我怎样才能将给我的匿名 javascript 函数称为

(a,b) { return a+b;}

请注意缺少“sum”函数名,因此是匿名的,这是正确的 javascript 语法

【问题讨论】:

  • 除非您将其分配给变量,否则您也无法在 javascript 中调用此函数。因此该函数不会被存储到上下文的 globalObject 中并且不能被调用

标签: javascript swift


【解决方案1】:

怎么样

import JavaScriptCore
let context = JSContext()
let value : JSValue = context.evaluateScript("(function (a,b) { return a+b; })")
let result = value.invokeMethod("call", withArguments: ["this",1,2])
print(result.toInt32())

【讨论】:

  • 这需要将函数包装在 (....) 中,然后它确实可以工作。我已经通过使用 var = function... 设计了一个类似的解决方案...请参阅下面我更喜欢的解决方案,因为它实际上使在 swift 中调用函数更加清晰(使用 var 的名称而不是“调用”这个...)
【解决方案2】:

根据 Christian 的反馈,我找到了解决问题的方法,将其分配给如下变量:

    //this is the function that was passed to us that needs to be executed
    let givenJavaScriptFunction="function (a,b) {return a+b;}"
    //because the given function string does not contain a name
    //we add it to a variable " var sum = function price(a,b)..."
    let namedFunction = "var sum = " + givenJavaScriptFunction
    //create context
    let context = JSContext()
    //create conext
    context.evaluateScript(namedFunction)
    //get ref to our  function
    let function = context.objectForKeyedSubscript("sum")
    //call the function with the arguments
    let result = function.callWithArguments([10,7])
    //return value
    return result.toDouble()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多