Движок правил wb-rules 1.7: различия между версиями

(Новая страница: «В обновлённом движке правил wb-rules присутствует ряд важных нововведений, касающихся логи…»)
 
Строка 45: Строка 45:
}, 1000);
}, 1000);
</syntaxhighlight>
</syntaxhighlight>
==== Примечание ====
В предыдущих версиях wb-rules для изоляции правил рекомендовалось использовать замыкание, т.е.
оборачивание кода сценария в конструкцию:
<syntaxhighlight lang="js">
(function() {
    // код сценария идёт здесь
})();
</syntaxhighlight>
Начиная с версии 1.7, в подобной конструкции нет необходимости. Тем не менее, старые сценарии,
использующие эту конструкцию, продолжат работу без изменений в поведении.
==== Обходной путь ====
Если в вашей системе использовалось общее глобальное пространство для хранения общих данных и функций,
есть несколько способов реализации такого поведения:
===== Использование модулей =====
см. Модули
===== Прототип глобального объекта =====
'''ВНИМАНИЕ:''' метод считается "грязным", т.к. все переменные и функции, опубликованные таким образом,
становятся доступными всем сценариям в системе. Старайтесь избегать этого способа. За неопределённое
поведение при использовании этого метода несёт ответственность сам программист.
Глобальные объекты всех сценариев имеют общий объект-''прототип'', в котором определены стандартные функции
wb-rules (такие, как defineRule, setTimeout и т.д.). Через него можно передавать переменные или функции
в общую область видимости.
<syntaxhighlight lang="js">
global.__proto__.myVar = 42; // теперь myVar - общая переменная для всех сценариев
// из других сценариев к переменной можно обращаться так
log("shared myVar: {}", myVar);
// или вот так, что чуть более аккуратно, т.к. однозначно показывает, где определена переменная
log("shared myVar: {}", global.__proto__.myVar);
</syntaxhighlight>
Правило поиска переменной в первом случае будет выглядеть так:
# Проверяем, есть ли myVar среди локальных переменных (определённой как var myVar = ...).
# Если нет, проверяем, есть ли myVar в глобальном объекте (определённой как myVar = ...).
# Если нет, проверяем, есть ли myVar в ''прототипе'' глобального объекта (определённой как global.__proto__.myVar).
Поиск останавливается, как только переменная найдена.
Таким образом, первый способ обращения будет работать только в том случае, если myVar не определена в верхних областях видимости.
wb_editors
154

правки