Глобальное значение, изменяющее содержимое при установке другой переменной с содержимым глобальной переменной - PullRequest
0 голосов
/ 09 октября 2018

Если вы посмотрите на следующий пример, вы увидите, что я устанавливаю глобальное значение при запуске.После этого, если вы нажмете на модуль ввода, вы увидите, что я установил для 22 атрибут tag_id объекта с новым значением.Я не понимаю, почему глобальный объект меняет значение tag_id на 22, если я устанавливаю значение в другой переменной.Я не хочу, чтобы глобальное значение изменилось.

[{"id":"a1dc09e7.208b48","type":"function","z":"81ac975c.542c88","name":"","func":"var o = global.get(\"machine\");\nnode.warn(o[1]);\no[1].tag_id = 22;\n\n","outputs":1,"noerr":0,"x":350,"y":320,"wires":[[]]},{"id":"4cca337d.f22bfc","type":"inject","z":"81ac975c.542c88","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":"5","x":140,"y":320,"wires":[["a1dc09e7.208b48"]]},{"id":"fd1f90c5.86b85","type":"inject","z":"81ac975c.542c88","name":"Startup","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":140,"y":220,"wires":[["950e20e9.dd2d3"]]},{"id":"950e20e9.dd2d3","type":"function","z":"81ac975c.542c88","name":"","func":"msg ={\n\t\"1\": {\n\t\t\"timestamp\": \"\",\n\t\t\"tag\": \"\",\n\t\t\"tag_id\": 0,\n\t\t\"value\": 0,\n\t\t\"units\": \"\"\n\t}\n}\n\nglobal.set(\"machine\",msg);\n\n//return msg;   ","outputs":1,"noerr":0,"x":350,"y":220,"wires":[[]]}]

1 Ответ

0 голосов
/ 09 октября 2018

Это нежелательное следствие того, что JavaScript передает объекты по ссылке, а не по значению.Когда вы извлекаете объект из контекста, вы получаете ссылку на объект в контексте.Любое сделанное вами обновление затем отражается в контексте.

Если вы хотите изменить объект без изменения оригинала, вам нужно его клонировать:

var o = RED.util.cloneMessage(global.get("machine"));
...