проблема при вызове функции

Поддержка
  • @sergerdn тоже стараюсь свести их использование к минимуму

  • @sergerdn said in проблема при вызове функции:

    Я, кстати, тоже считал, что метки имеют локальную область видимости(функция), а не глобальную(весь скрипт).

    В бас вообще нет такого понятия как область видимости

  • @UserTrue said in проблема при вызове функции:

    В бас вообще нет такого понятия как область видимости

    Не согласен, но холивар разводить не буду.

  • @sergerdn said in проблема при вызове функции:

    Не согласен, но холивар разводить не буду.

    Аха, отличный аргумент. Вы экстрапалируете свои представления и ожидания с другим платформ/языков на БАС и потом удивляетесь, что в бас это так не работает, но в бас нигда не заявлено что в нем это должно работать подобным образом.

  • @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. Обе переменные выводятся в лог для проверки:

    9478ccf7-f688-4dc1-9274-55de1b65f1aa-изображение.png

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

    42a4507b-0817-4271-8d5c-a508bc191702-изображение.png


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

    f73f049e-4d28-4631-9f72-a3b1ed8d0ff3-изображение.png

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

    6c49be2e-0e19-4c3e-8ca2-1d75f4fcbbc8-изображение.png

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

    8b216017-c602-455a-a6d1-419850ef141a-изображение.png

    4e5e3a6c-cb62-4939-bcab-af2ed166f04d-изображение.png

    То есть технически переменные 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

  • @Fox

    Набросал тестовый скрипт. Я так понимаю, что существует только один способ изоляции переменных, это асинхронный запуск функций.

    Чтобы случайно не изменить в функции значение переменной, которая объявлена в потоке, что ее вызвал.

    Capture.PNG
    Capture_1.PNG Capture_3.PNG

    // асинхронный вызов функции, переменная не изменена в потоке, что ее вызвал
    [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
    

    Скрипт:

    variables_test_1.xml

  • @sergerdn said in проблема при вызове функции:

    @Fox

    Набросал тестовый скрипт. Я так понимаю, что существует только один способ изоляции переменных, это асинхронный запуск функций.

    Чтобы случайно не изменить в функции значение переменной, которая объявлена в потоке, что ее вызвал.

    Скрипт:

    variables_test_1.xml

    Вызывать асинхронную функцию только для того, что бы не переопределить случайно объявленные ранее переменные как то слишком жирно. Можно с тем же успехом добавлять к названию переменной название функции, где она используется. Ну или использовать переменные js по возможности.

    Думаю нужно пояснить, что было понятно. Создайте в функции действие "Выполнить код" с кодом var VAR_NEW_VARIABLE2 = "TEST2"
    Этим самым вы создадите переменную BAS, которая будет работать во всех действиях BAS и при этом не будет видна вне функции, где её объявили (в режиме "запуска"):

    a0d2e34d-7fca-4fbc-a56e-28eca9ea886a-изображение.png

    43008880-81c2-4587-9305-714960013dfb-изображение.png

    Тестовый скрипт: 2809.xml

  • 0 Votes
    2 Posts
    367 Views
  • 0 Votes
    2 Posts
    392 Views
  • 0 Votes
    29 Posts
    2583 Views
  • 0 Votes
    4 Posts
    486 Views
  • 0 Votes
    3 Posts
    474 Views