присваивание undefined

Здравствуйте. Кажется, на лекции (или где-нибудь ещё, не помню точно) говорилось о том, что присваивание чему-нибудь undefined противоречит сути самого undefined. Прошу благородных гуру прокомментировать этот код из известного источника, действительно ли плохо ли то, что в нём переменной присваивается undefined, или я что-то напутал?
http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_webworker

Насколько я понял ничего страшного в присвоении undefined нет, по крайней мере если ты будешь дальше явно присваивать значение переменной. Однако, это может вызвать неприятные последствия, т.к. интерпретатор на это ругаться не будет и код будет считаться валидным, но из-за специфики undefined может работать некорректно.

Касательно ссылки:
if(typeof(w) == "undefined")
я считаю что тут по средствам undefined реализована некая петля, ведь переменная w (которая объявлена выше var w) при старте скрипта будет иметь значение undefined, а также ей строго присваивается undefined при нажатии на “Stop Worker”. Таким образом мы будем попадать в нужный участок при первом нажатии на “Start Woker”, а затем только в том случае, если перед нажатием на “Start Woker” нажмем “Stop Worker”.

Это то как понял этот кусок кода я, однако есть еще одно замечание. Строка if(typeof(w) == "undefined") не очень хороша, т.к. при сравнении таким образом может вернуться true, даже если переменная имеет значение null, строка выше (if(typeof(Worker) !== "undefined")), по моему мнению, написана более правильно.

В самом по себе присваивании undefined-а нет ничего плохого. В примере он используется для того, чтобы обнулить значение переменной (и остальная логика скрипта завязана на конструкцию: если в переменной что-то есть, ничего не делай, если в переменной ничего - запиши в нее вебворкер.

Абсолюта не существует. Нельзя сказать, что код плох. Можно сказать, что он создает потенциальные проблемы. Что в нем проще ошибиться, о нем сложнее думать.

Я ещё знаю, что идеального кода не существует :smile:
Наличие потенциальных проблем в коде хуже чем если бы их небыло. Некоторые программисты сказали бы про код, что от него типа “пахнет”, да каких только слов не напридумывают люди, чтобы случайно не обидеть других людей. Однако выявить проблему это половина успеха, для полного счастья я хотел бы узнать ваше мнение, каким образом этот код не мешало бы поправить. Заменить == на === это понятно, а что делать с undefined? Минуту назад я думал что его можно заменить на null, пока не получил в консоле typeof(null)===“object” .

В рамках решаемой задачи: продемонстрировать работу webworkerow, код выглядит нормально.

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

var w;

function startWorker() {
    if(!w) {
        w = createWebWorker("demo_workers.js");
    }
    w.onmessage = function(event) {
        document.getElementById("result").innerHTML = event.data;
    };
}

function stopWorker() { 
    w.terminate();
    w = null;
}

Такой код больше похож на реальность.

1 лайк

Спасибо за ответ. Кажется, я впервые в жизни осознал, что такое паттерны проектирования. Ну это типа такие сложные штуки с помощью которых можно управлять намного более сложными штуками. Не для джунов, но всё равно интересно.
Ваш код немножко неправильный, нужно строчку w = createWebWorker("demo_workers.js"); заменить на w = new Worker("demo_workers.js");, как было до этого. Похоже что Worker это встроенный объект браузера, как Math, а что такое demo_workers.js мне пока не понятно. Но это не так важно и не по теме =).
Вопрос ближе теме занятий: typeof(null)==="object" это не более чем проявление “сломаности” оператора typeof, а на самом деле null и undefined это единственные сущности, которые не есть объектами в JS, верно?

Абсолютно верно.

1 лайк