Благодарю, буду пробовать
проблема при вызове функции
-
@UserTrue said in проблема при вызове функции:
Аха, отличный аргумент.
Вероятно, я имею право иногда высказывать свое мнение без аргументации.
@UserTrue said in проблема при вызове функции:
... что в бас это так не работает.
В режиме записи область видимости переменных глобальная, а в режиме запуска - локальная.
Метки в браузере имеют глобальную область видимости.
-
@sergerdn said in проблема при вызове функции:
В режиме записи область видимости переменных глобальная, а в режиме запуска - локальная.
Это тоже не верно в режиме записи работает только один поток, область видимости всегда в рамках потоках.
Что касается функции onApplicationStart то в запуске она тоже исполняется в отдельном потоке до запуска остальных функции, а в записи она исполняется в этом же потоке что и остальной код, это единственный нюанс который тут естьА что за метки в браузере я не знаю
-
@UserTrue said in проблема при вызове функции:
Это тоже не верно в режиме записи работает только один поток, область видимости всегда в рамках потоках.
Переменные меняют область видимости при:
- запуск в режиме записи(глобально по отношению к функциям)
- запуск в один поток (локально по отношению к функциям)
А есть еще отдельная глобальная область видимости для глобальных переменных. А еще есть область видимости ресурсов(глобальная).
Честно говоря не совсем понимаю, что ты так уцепился за мое мнение, что в BAS есть область видимости переменных.
-
@sergerdn said in проблема при вызове функции:
Честно говоря не совсем понимаю, что ты так уцепился за мое мнение, что в BAS есть область видимости переменных.
Потому что ее нет)) Глобальные переменные если только, но разговор был про области видимости функций.
Потом не удивляетесь что бас работает не так как вы думали xD
-
@UserTrue said in проблема при вызове функции:
Потому что ее нет)) Глобальные переменные если только, но разговор был про области видимости функций.
Глобальные переменные это и есть область видимости.
@UserTrue said in проблема при вызове функции:
В бас вообще нет такого понятия как область видимости
Я отвечал на это утверждение. Что, как минимум, существует область видимости в разрезе переменных и ресурсов, что тоже, впрочем переменные. Еще и метки, предположительно, всегда имеют глобальную область видимости.
Вероятно, ты имел в виду, что в BAS нет понятия область видимости функций. Мое мнение, что она есть и она всегда глобальная. Из любого места можно всегда вызвать любую функцию.
@UserTrue said in проблема при вызове функции:
Потом не удивляетесь что бас работает не так как вы думали xD
Безусловно, все мы люди и все мы ошибаемся. И никто не исключение.
Но почему ты взял на себя миссию в это топике обязательно меня убедить, что твое мнение должно совпадать с моим - мне не понятно.
Так как каждый человек имеет право на свое, пусть даже иногда и ошибочное, мнение.
-
@sergerdn said in проблема при вызове функции:
Я отвечал на это утверждение. Что, как минимум, существует область видимости в разрезе переменных и ресурсов, что тоже, впрочем переменные
Область видимости это как правило в первую очередь область видимости функции и процедур, затем циклов и условий, а также блоков.
Глобальные переменные это скорее частный случай уровня всего приложения. Что касается ресурсов то это вообще просто API для синхронной работы с общими данными. С тем же успехом можно назвать базу данных глобальной областью видимости.Мое мнение, что она есть и она всегда глобальная
Глобальная область видимости подразумевает наличие локальной, которой в БАС в сущности нет.Но почему ты взял на себя миссию в это топике обязательно меня убедить,
Нет у меня никакой миссии и философствовать на эти темы я не стану. Форум он то форум, что это место для дискуссий.
-
@UserTrue said in проблема при вызове функции:
Кроме того глобальная область видимости подразумевает наличие локальной, которой в БАС в сущности нет.
Вероятно, все таки есть локальная область видимости переменных.
Переменная, созданная внутри функции, видна только внутри функции, если это не режим записи в BAS.
Иначе говоря такая переменная имеет свою локальную(внутри функции) область видимости.Такая переменная, вероятно, уничтожается движком BAS, когда функция заканчивает работу. Уничтожений переменных внутри функции только предположение, настолько в исходники я не погружался.
-
@sergerdn said in проблема при вызове функции:
Переменная, созданная внутри функции, видна только внутри функции, если это не режим записи в BAS.
Иначе говоря такая переменная имеет свою локальную(внутри функции) область видимости.Если эта функция не асинхронная, которая в сущности является другим потоком, то область ее видимости так же весь поток
-
Какой то странный у вас получился спор.. Локальные переменные BAS видны в любых функциях в пределах одного потока, переменные js ограничены функцией в которой были объявлены.
Вот тестовый скрипт: 2808.xml
В нём есть функция "q" в которой объявляется переменная BAS [[NEW_VARIABLE]] и переменная js test. Обе переменные выводятся в лог для проверки:

В функции "Main" стоит вызов функции "q" и также вывод в лог обеих переменных:

В режиме "записи" логи в функции "q" и функции "Main" отработают корректно:

В режиме "запуска" в функции "q" сработают корректно оба лога, однако в функции "Main" корректно сработает вывод в лог только переменной BAS. Вывод переменной js вернёт ошибку:

Однако если в переменной js убрать "var", то эта переменная также будет корректно видна в функции "Main"


То есть технически переменные BAS это глобальные переменные js -
[[NEW_VARIABLE]] === VAR_NEW_VARIABLE -
@UserTrue said in проблема при вызове функции:
Если эта функция не асинхронная
Вероятно, у нас все таки отличия в трактовке терминов.
Когда я пишу функция - я имею в виду функцию, которую можно создать в IDE BAS, а не какие функции у себя BAS вызывает под капотом.
Я всегда считал, что такая функция в BAS не может быть синхронной или асинхронной, а может быть разным способ вызова функции - с ожиданием результата в том же потоке или запуске в фоне/не блокирующем основной поток режиме.
Может быть, что способ запуска функции, меняет область видимости переменных. Этот момент мне не известен.
Тут можно сделать вывод, что все таки, если что-то меняется, значит оно существует 😄
-
@Fox said in проблема при вызове функции:
Какой то странный у вас получился спор..
Изначально шла речь об отсутствии/наличии области видимости в BAS.
Потом уже перешли в какие именно области видимости есть и как они себя ведут. И, вероятно, даже как они должны называться.
Мое мнение - область видимости в BAS существует. Как минимум переменных.
У @UserTrue другое мнение(как минимум было в начале разговора):
@UserTrue said in проблема при вызове функции:
В бас вообще нет такого понятия как область видимости
-
@sergerdn said in проблема при вызове функции:
У @UserTrue другое мнение(как минимум было в начале разговора):
Оно и осталось (я просто пытался разжевать все нюансы), @fox тоже самое сверху написал, что есть область видимости потока и все. Ну область видимости js, или браузера это уже немного про другое.
-
@Fox said in проблема при вызове функции:
То есть технически переменные BAS это глобальные переменные js - [[NEW_VARIABLE]] === VAR_NEW_VARIABLE
Спасибо, никогда не задумывался, что переменные есть двух типов:
- [[NEW_VARIABLE]] === VAR_NEW_VARIABLE // BAS global var(global Javascript)
- [[NEW_VARIABLE]] === NOT_WAR_JUST_PEACE_NEW_VARIABLE // not BAS, but Javascript local var
-
@sergerdn said in проблема при вызове функции:
@Fox said in проблема при вызове функции:
То есть технически переменные BAS это глобальные переменные js - [[NEW_VARIABLE]] === VAR_NEW_VARIABLE
Спасибо, никогда не задумывался, что переменные есть двух типов:
- [[NEW_VARIABLE]] === VAR_NEW_VARIABLE // BAS global var(global Javascript)
- [[NEW_VARIABLE]] === NOT_WAR_JUST_PEACE_NEW_VARIABLE // not BAS, but Javascript local var
[[NEW_VARIABLE]] === WAR_NEVER_CHANGES_NEW_VARIABLE
-
Набросал тестовый скрипт. Я так понимаю, что существует только один способ изоляции переменных, это асинхронный запуск функций.
Чтобы случайно не изменить в функции значение переменной, которая объявлена в потоке, что ее вызвал.


// асинхронный вызов функции, переменная не изменена в потоке, что ее вызвал [844256966] [05:06:05] Thread #1 : [main thread]: main thread var value [828116099] [05:06:05] Thread #2 : [function param]: function param, this value should be protected from being changed within the function [05:06:05] Thread #2 : Thread ended with message "Ok" [752904000] [05:06:05] Thread #1 : [main thread]: main thread var value // синхронный вызов функции, переменная изменена в потоке, что ее вызвал [828116099] [05:06:05] Thread #1 : [function param]: function param, this value should be protected from being changed within the function [687643394] [05:06:05] Thread #1 : [main thread]: function param, this value should be protected from being changed within the function [05:06:05] Thread #1 : Thread succeeded with message "Ok" [05:06:05] Script finished correctlyСкрипт:
-
@sergerdn said in проблема при вызове функции:
Набросал тестовый скрипт. Я так понимаю, что существует только один способ изоляции переменных, это асинхронный запуск функций.
Чтобы случайно не изменить в функции значение переменной, которая объявлена в потоке, что ее вызвал.
Скрипт:
Вызывать асинхронную функцию только для того, что бы не переопределить случайно объявленные ранее переменные как то слишком жирно. Можно с тем же успехом добавлять к названию переменной название функции, где она используется. Ну или использовать переменные js по возможности.
Думаю нужно пояснить, что было понятно. Создайте в функции действие "Выполнить код" с кодом
var VAR_NEW_VARIABLE2 = "TEST2"
Этим самым вы создадите переменную BAS, которая будет работать во всех действиях BAS и при этом не будет видна вне функции, где её объявили (в режиме "запуска"):

Тестовый скрипт: 2809.xml
-
@Fox said in проблема при вызове функции:
Вызывать асинхронную функцию только для того, что бы не переопределить случайно объявленные ранее переменные как то слишком жирно.
Да, есть такое.
@Fox said in проблема при вызове функции:
Можно с тем же успехом добавлять к названию переменной название функции, где она используется.
Да, тоже способ, но требует внимательности и соблюдения правил, что нельзя вызвать в функции чужую переменную из другой функции.
Вероятно, это мне не актуально, так как у меня задача - вызвать функцию в изолированной среде по отношению только к основному потоку.
@Fox said in проблема при вызове функции:
Думаю нужно пояснить, что было понятно. Создайте в функции действие "Выполнить код" с кодом var VAR_NEW_VARIABLE2 = "TEST2"
Хороший способ, мне нравится.
Осталось выяснить, как реализовать изоляцию переменных внутри функции, если внутри функции вызвано что-то, что возвращает переменную BAS. Наверное, только способ называть переменную с результатом с префиксом в названии.
И осталось выяснить как сделать так, чтобы внутри функции не было доступа к переменным, который не переданы ей в параметрах и которые объявлены в основном потоке как BAS переменные.
-
@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 -
@UserTrue said in проблема при вызове функции:
@Fox а ещё это дополнительная нагрузка )
Любые дополнительные вычисления являются дополнительной нагрузкой :)
Лично для меня не создаёт проблем отсутствие изоляции внутри функций
Да, для меня тоже. Мне просто было интересно найти возможность реализовать задачу.