2017-07-31 87 views
0

我使用Jint來解析JS代碼並調用其中的函數。在我使用多線程環境時,我使用了對此問題的迴應中指出的程序分析方法:https://github.com/sebastienros/jint/issues/384在解析的Jint程序中調用函數

所以我擁有的是Jint.Parser.Ast.Program實例。我可以遍歷其中的IFunctionDeclaration並找到我的功能。但我不知道如何實際調用的函數...

Dim parser As New Jint.Parser.JavaScriptParser 
Dim program As Jint.Parser.Ast.Program = parser.Parse(code) 

For Each func As Jint.Parser.IFunctionDeclaration In program.FunctionDeclarations 
    If func.Id.Name = myFunctionName Then 
     ' How to call the function? 
    End If 
Next 

我只找到了一種方法來執行整個Program。我假設我必須這樣做,以便這些函數實際上在引擎中定義。但是,如何在腳本中調用某個函數呢?

+0

我不明白你爲什麼要這樣做。你只想調用你的函數,如果它在腳本中定義的話?爲什麼你需要一個解析器來做到這一點,你可以嘗試調用它,如果它被定義,這是一個優化? – Tewr

回答

0

一旦你的程序被執行,只需使用相同的方法來執行你的功能。示例是c#

var parser = new Jint.Parser.JavaScriptParser(); 
// _parserCache is a static ConcurrentDictionary<string, Jint.Parser.Ast.Program> 
var program = _parserCache.GetOrAdd(scriptName, key => parser.Parse(code)); 

foreach (var func in program.FunctionDeclarations) 
{ 
    if (func.Id.Name == myFunctionName) 
    { 
     var exec = new Engine(); 
     // The entire program is executed, to define the function 
     exec.Execute(program); 
     // now you can call your function 
     exec.Execute($"{myFunctionName}()"); 
    } 
} 
+0

這基本上也是我想出來的。我只是使用'exec.Invoke(myFunctionName,params)'來傳遞參數。我想知道是否有一種方法可以在不執行程序的情況下調用函數,但是沒有 –