我正在使用C ++的微软Chakracore,我编写了一个基本的评估器,我可以从read-eval-print循环中反复调用,如下所示:
void readEvalPrint(const char *prompt, JsSourceContext sourceContext) {
JsValueRef result;
JsValueRef scriptSource;
JsValueRef fileName;
JsErrorCode status;
JsValueRef strResult;
std::string script;
std::cout << prompt;
std::cout.flush();
std::getline(std::cin, script);
JsCreateString("", 0, &fileName);
JsCreateExternalArrayBuffer(const_cast<char*> (script.c_str()), script.length(), nullptr, nullptr, &scriptSource);
status = JsRun(scriptSource, sourceContext, fileName, JsParseScriptAttributeNone, &result);
if (status != JsNoError) {
JsValueRef exception;
// TODO: print stack trace
JsGetAndClearException(&exception);
std::cout << "Error: Could not evaluate expression" << std::endl;
return;
}
status = JsConvertValueToString(result, &strResult);
if (status != JsNoError) {
std::cout << "Could not convert expression to displayable form" << std::endl;
return;
}
size_t written;
size_t bufferSize;
JsCopyString(strResult, nullptr, std::numeric_limits<int>::max(), &bufferSize);
char buffer[bufferSize+1];
JsCopyString(strResult, buffer, bufferSize, &written);
buffer[bufferSize] = 0;
std::cout << buffer << std::endl;
}
这似乎适用于大多数情况,但是当我输入javascript函数声明时,虽然我可以调用函数并且它产生正确的结果,如果我只是尝试按名称检查函数以查看它的正文期望通过调用其toString()方法与任何javascript函数,结果是非常明显的垃圾。如果我检查其他函数,比如内置函数,我会看到预期的结果(即'function function-name(){[native code]}',如果我创建一个匿名函数,例如,var a = function foo ()....并尝试显示a的值,我完整地看到了匿名函数定义。但是,我似乎无法弄清楚如何显示我在JsRun()的前一次迭代中定义的命名函数.I我要么做错了,要么误解了一些预期的行为,否则我发现了一个错误。但是,我还不能流利地使用Jsrt API来确信它是哪一个。