【问题标题】:How to call subfunction in JavascriptCore?如何在 JavascriptCore 中调用子函数?
【发布时间】:2017-04-07 17:05:38
【问题描述】:

我在我的应用程序中使用JavascriptCore,但遇到了一些问题。我的 javascript 是这样的结构:

var Restaurant = function()
{
    this.street = function()
    {
        return "One Street 45";
    }

    this.postal = function()
    {
        return "90210";
    }
}

现在,我在 Javascript 中创建了一个函数,允许餐厅将自己添加到地图中:

addMeToTheMap(Restaurant);

JSContext 中,这映射到:

self.context[@"addMeToTheMap"] = ^(JSValue *restaurant) {
};

我觉得困难的是能够调用streetpostal 函数。我尝试做[[restaurant callWithArguments:nil] @"street"] callWithArguments:nil],但没有奏效。有什么想法吗?

【问题讨论】:

  • 如何创建对restaurant 的引用?
  • 我不是。 javascript中的Restaurant变量可以有任何名字。
  • 对,我的意思是你在做什么:JSValue *restaurant = self.context[@"Restaurant"]?
  • 我正在从addMeToTheMap() 函数中获取值,那么有必要这样做吗?

标签: ios objective-c javascriptcore


【解决方案1】:

为什么

想一想你在[[restaurant callWithArguments:nil] @"street"] callWithArguments:nil] 中所说的合乎逻辑的内容。

在 JavaScript 中的餐厅函数中没有 return 语句。所以[restaurant callWithArguments:nil] 将返回 void。

还有streetpostal 都返回字符串。不是this,因此[[... @"street"] callWithArguments:nil] 试图将字符串作为函数调用。更不用说这甚至不应该因为[... @"some string"]而编译。

你真正想要的

您想要做的是在JSValue 上使用objectForKeyedSubscript: 方法,该方法返回JSValue。所以不要使用callWithArgs。你应该这样做:

[restaurant[@"street" <or> @"postal"] callWithArguments:nil]

这将返回包裹在JSValue 中的字符串。您可以使用 toString 解包。

【讨论】:

  • 好吧,如果我这样做,它会返回(null)。这就是我将其更改为:self.context[@"addMeToTheMap"] = ^(JSValue *restaurant) { NSLog(@"street: %@", [restaurant[@"street"] callWithArguments:nil]); };
  • 你能登录restaurantrestaurant[@"street"] 吗?
猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多