Добавить функцию Javascript в глобальную область видимости

#javascript #c #emscripten

#javascript #c #эмскриптен

Вопрос:

У меня есть приложение emscripten. У меня есть файл javascript, в котором есть определение функции. Я загружаю этот файл в строку, а затем вызываю emscripten_run_script его. Затем я пытаюсь вызвать эту функцию позже, используя какой-нибудь встроенный EM_ASM вызов, но он говорит, что определение функции не может быть найдено.

     std::ifstream file("script.js"); // script.js has "someFunc" defined
    std::string str((std::istreambuf_iterator<char>(file)),
                     std::istreambuf_iterator<char>());

    emscripten_run_script( str.c_str() );

     // the below give error "someFunc not defined"
     EM_ASM({
        someFunc();
    });
 

Однако, если я загружу этот файл javascript в строку, а затем добавлю строку с вызовом функции

     std::ifstream file("script.js"); // script.js has "someFunc" defined
    std::string str((std::istreambuf_iterator<char>(file)),
                     std::istreambuf_iterator<char>());

    auto combinedStr = str   "someFunc();";

    emscripten_run_script( combinedStr.c_str() ); // works fine
 

Как я могу добавить функцию javascript, определенную в файле, в глобальную область видимости для последующего использования?

Файл javascript выглядит следующим образом:

 function someFunc()
{
}
 

Ответ №1:

В тестах, которые я сделал, это, похоже, работает, что должно быть эквивалентно тому, что вы сделали:

 #include <stdio.h>
#include <emscripten.h>

int main()
{
    char script[] = "someFunc = function() {"
                    "console.log("hello");"
                    "};";

    emscripten_run_script(script);

    EM_ASM({
        someFunc();
    });
}
 

Является ли ваше script.js объявление функции локальной по области видимости (через var someFunc = function(){...}; или как-то так)? emscripten_run_script не совсем похоже на JavaScripts eval , а локальные переменные существуют только в области видимости emscripten_run_script .

Комментарии:

1. Спасибо, простое переключение с «function someFunc()» на «someFunc = function()» сделало свое дело!