Как функции передать ссылку на глобальную переменную


#1

Если задать конструкцию вида:

myvariable = 10

function(variable) {
  variable = 5)
}

то при вызове этой функции как function(myvariable) изменится лишь значение внутри функции, но не сама глобальная переменная. Нужно передать ссылку на саму глобальную переменную внутрь функции: какой правильный синтаксис?


#2

Яваскрипт умеет так работать только со ссылками на объекты. Строки, числа и прочие примитивы - нет. Вы какую задачу пытаетесь решить?


#3

Хотел создать функцию, которая бы работала в нескольких сценариях. Сценарий отличается тем, что я передаю функции в виде параметра некоторую глобальную переменную, в которой содержится текст. По результату работы этой функции, значение этого текста может быть изменено. Сейчас я вышел из положения таким образом, что сценарий у меня один и я работаю с глобальной переменной напрямую через её имя, а не через переданный параметр внутри функции (если так и оставить, то нужно под каждый сценарий писать свою функцию).


#4

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


#5

Правильно ли я сделал, что в каждом из скриптов, где есть обращение к глобальной переменной инициировал создание объекта?

rules.js:

defineRule("schedule", {
  when: cron("@every 10s"),
  then: function() {
  	log("New greeting: " + ps.key);
	}
});
var ps = new PersistentStorage("my-storage", { global: true });
log(ps.key);
// place your rules here or add more .js files in this directory
log("add your rules to /etc/wb-rules/");

global.js:

var ps = new PersistentStorage("my-storage", { global: true });

ps.key = "Hello World"; 

Так работает:

2019-02-25 20:19:33add your rules to /etc/wb-rules/

2019-02-25 20:19:43New greeting: Hello World

2019-02-25 20:19:53New greeting: Hello World

#6

Хотя правильнее наверно просто декларировать без объявления:

var other_ps = PersistentStorage("my-storage", { global: true });
defineRule("schedule", {
  when: cron("@every 10s"),
  then: function() {
  	log("New greeting: " + other_ps.key);
	}
});
// place your rules here or add more .js files in this directory
log("add your rules to /etc/wb-rules/");

Тоже работает!


#7

Да, спасибо! У меня тоже заработало, но что-то стал часто контроллер зависать теперь. Ладно, буду разбираться что с ним не так стало(

Стоит только ошибиться в имени переменной и все зависает наглухо, только ребут помогает, если предварительно скрипт почистить нотепадом…

Товарищи из WB, пожалуйста, прокомментируйте, как правильно пользоваться глобальными переменными? Или это только у меня такие глюки?


#8

Контроллер зависает, когда вы выполняется скрипт с неверным именем переменной? Или в каких-то случаях с корректными скриптами тоже?


#9

с несуществующими переменными точно зависало, но пока что не могу проверить разбираюсь с другой бедой(


#10

Не могу понять, как создать объект, в который как в строке

var other_ps = PersistentStorage("my-storage", { global: true });

можно было бы объектом (global:true) передать входные переменные? Я не силен в js, на просторах не смог найти примера.
Я делаю так, определяю объект, который потом неск. раз буду вызывать:

var Class1 = function()
{
this.Name = null ;
this.Value = null;

this.do = function()
{
log("Name is " + this.Name + ", value is " + this.Value);
}
}

var SW = new Class1();
SW.Name = “SW name”;
SW.do();

var SW1 = new Class1({Name:“SW1”});
SW1.do();

получаю закономерно
2019-02-27 21:10:59Name is SW name, value is null
2019-02-27 21:10:59Name is null, value is null

Я понимаю, что присваивается в первом случае свойство, которое я передал, но как сделать чтобы заработал второй вызов с переданными именованными параметрами - не знаю, подскажите, пожалуйста, был бы признателен за помощь.


#11

отдельный вопрос. Если я хочу создать несколько файлов с разными функциями, чтобы потом использовать их как библиотеки в моем проекте, как лучше поступать?
Присвоить функцию PersistentStorage как-то пока не получается, экспериментирую, но, чувствую, могу дел наворотить… Очень уж не хочется писать одну портянку на всю работу. Как это лучше организовать?

to poglazov
Например, я хочу в глобальную видимость перевести объект, чтобы потом из других скриптов его вызывать, создавать экземпляры, задавать свойства и т.д.

var GL = new PersistentStorage(“global_functions”,{global: true});
GL.temp = “global temp”;

GL.Class1 = function()
{
this.Name = null ;
this.Value = null;

this.do = function()
{
log("Name is " + this.Name + ", value is " + this.Value);
}
}

SW = new GL.Class1();
SW.Name = “SW name”;
SW.do();

var SW1 = new Class1({Name:“SW1”});
SW1.do();

log (GL.temp);

при объявлении Class, как глобального - все ок, не виснет, только вызываю новый экземпляр - все отваливается(
причем при ручном удалении этого скрипта из директории
:~# wb-rules restart
ERROR: 2019/02/27 18:38:47 error loading script file/dir restart: stat restart: no such file or directory
ERROR: 2019/02/27 18:38:47 no valid scripts found - не помогает и wb не отвисает,
а вот :~# service wb-rules restart помогает.


назначил(а) ответственного poglazov #12

#13

очень жду ответа, если можно, хотя бы коротко, натолкните, как решить вопрос? Очень не удобно портянку из универсальных функций в каждый скрипт вставлять(


#14

Боюсь, не очень смогу вам помочь; скажите а вы пробовали использовать модули?
https://wirenboard.com/wiki/index.php?title=Движок_правил_wb-rules_2.0&section=15#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D0.B8


#15

у меня версия 1.7. Хотя вот недавно купил контроллер.


#16

Версия 2.0 – это бета, можете попробовать установить deb-пакет из репозитория:


#17

А этой версией 2.0 можно пользоваться? Она не глючная? А то наворочу сейчас делов с бета версией, потом не разгребусь)


#18

Она не хуже предыдущей, и новый функционал, конечно, проверяли. Тщательного тестирования не производилось – поэтому, что называется “используйте на свой страх и риск”, как с любой бета-версий.