2017-04-07 38 views
0

我在我的應用中使用JavascriptCore,但有一些麻煩。我的JavaScript結構是這樣的:如何在JavascriptCore中調用子功能?

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],但那沒有奏效。有任何想法嗎?

+0

你是如何創建對'餐廳'的引用? – Oxcug

+0

我不是。 javascript中的'Restaurant'變量可以有任何名稱。 – user4992124

+0

對,我的意思是你在做:'JSValue * restaurant = self.context [@「Restaurant」]'? – Oxcug

回答

0

爲什麼

想想你在邏輯上說[[restaurant callWithArguments:nil] @"street"] callWithArguments:nil]

您在JavaScript中的餐廳功能中沒有return語句。所以[restaurant callWithArguments:nil]將返回void。

還有streetpostal都返回字符串。不是this,因此[[... @"street"] callWithArguments:nil]正試圖調用一個字符串作爲函數。更何況這不應該由於[... @"some string"]而編譯。

你真正想要

什麼你想要做的是使用上JSValueobjectForKeyedSubscript:方法返回一個JSValue。所以不要使用callWithArgs。你應該這樣做:

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

這將返回你的字符串包裹在JSValue。您可以使用toString解開。

+0

那麼,如果我這樣做,它會返回'(null)'。這是我改變它:'self.context [@「addMeToTheMap」] = ^(JSValue * restaurant)NSLog(@「street:%@」,[restaurant [@「street」] callWithArguments:nil]) ; };' – user4992124

+0

你可以登錄'餐廳'和'餐廳[@「街道」]嗎? – Oxcug

相關問題