@sergerdn said in проблема при вызове функции:
Осталось выяснить, как реализовать изоляцию переменных внутри функции, если внутри функции вызвано что-то, что возвращает переменную BAS. Наверное, только способ называть переменную с результатом с префиксом в названии.
И осталось выяснить как сделать так, чтобы внутри функции не было доступа к переменным, который не переданы ей в параметрах и которые объявлены в основном потоке как BAS переменные.
Странное желание, ну да ладно, если очень нужно можно использовать такой подход:
В начале работы функции сохраняем все существующие переменные из глобального объекта в локальную переменную js. После этого очищаем глобальный объект от переменных BAS, при этом если название переменной начинается на текст "ARGUMENT" - переменную оставляем (что бы можно было в функцию передать данные. Можно придумать любой другой способ):
var localGlobal = {};
Object.keys(GLOBAL).filter(function (e) {
return e.indexOf("VAR_") == 0;
}).reduce(function (all, one) {
if (one.slice(0, 12) != "VAR_ARGUMENT") {
localGlobal[one] = eval(one);
delete GLOBAL[one];
}
return all;
}, {});
В конце функции удаляем все созданные в функции переменные, кроме тех, которые начинаются на "SAVE" (что бы можно было получить результат из функции. Можно придумать любой другой способ). И восстанавливаем в глобальном объекте данные, которые сохранили ранее в переменной js:
Object.keys(GLOBAL).filter(function (e) {
return e.indexOf("VAR_") == 0;
}).reduce(function (all, one) {
if (one.slice(0, 8) != "VAR_SAVE") {
delete GLOBAL[one];
}
return all;
}, {});
Object.keys(localGlobal).reduce(function (all, one) {
GLOBAL[one] = localGlobal[one];
return all;
}, {});
Тестовый скрипт: 2813.xml
Я проверил работу этого способа в BAS в режиме "записи", "запуска" и в скомпилированном скрипте:

Но универсальность и стабильность такого способа я не гарантирую :D