Существует определенный шаблон JavaScript, который всегда беспокоил меня, и я так и не нашел правильный способ его решения.Вместо этого я обычно просто игнорирую это, потому что 99% интерпретаторов JavaScript поддерживают подъем функций, поэтому ошибок во время выполнения не возникает.
Рассмотрим следующее:
function onOpen()
{
console.log("Connected!");
ws.removeEventListener("open", onOpen);
ws.removeEventListener("error", onError);
}
function onError()
{
console.log("Failed to connect!");
ws.removeEventListener("message", onMessage);
ws.removeEventListener("error", onError);
}
var ws = new WebSocket("...");
ws.addEventListener("open", onOpen);
ws.addEventListener("error", onError);
В этом коде в пределах onOpen
function, я ссылаюсь на onError
до того, как onError
было определено ниже в коде.На самом деле это не проблема, потому что метод onOpen
не будет работать до тех пор, пока не будет определено onError
, но это все еще плохая практика и приводит к отключению правила ESLint «no-use-before-define»
В более общем смысле это ошибка, которая возникает, когда существуют две функции, каждая из которых должна ссылаться друг на друга:
function a(x) {
return x === 1 ? b(x) : 2;
}
function b(x) {
return x === 2 ? a(x) : 1;
}
Существует ли шаблон проектирования для устранения этой циклической зависимости?В моем простом обобщенном примере простое решение: «иметь только одну функцию»:
function a(x) {
return x === 1 ? 1 : 2;
}
Однако при привязке слушателей событий это не всегда представляется возможным.