На данный вопрос уже ответили:
let div = document.createElement('div');
document.body.appendChild(div);
setTimeout(document.body.removeChild, 1000, div); //Uncaught TypeError: Illegal invocation
setTimeout( function(){ document.body.removeChild(div);}, 1000 );
Правильны ли следующие рассуждения:
В первом случае на момент вызова функции removeChild сборщик мусора уже удалил переменную div (дошли до конца скрипта). Во втором случае при объявлении безымянной функции мы взяли переменную div с помощью замыкания, увеличив количество ссылок на нее, поэтому и смогли ей воспользоваться.
Нет, рассуждения неправильны.
"сборщик мусора уже удалил переменную div" - А как же ссылка, переданная в setTimeout
? Не говоря уже о том, что сам элемент находится в DOM-дереве и никуда не девается.
В Вашем коде функция removeChild
вызывается в чужом контексте - window
.
let div = document.createElement('div');
div.setAttribute("class", "mydiv");
document.body.appendChild(div);
setTimeout(document.body.removeChild.bind(document.body), 1000, div);
.mydiv {
width: 50px;
height: 50px;
border: 1px solid black;
background: lightgreen;
}
Update
Передавая куда-либо метод объекта, Вы отрываете его от контекста. Вашу ошибку можно воспроизвести более простым кодом:
let div = document.createElement('div');
div.setAttribute("class", "mydiv");
document.body.appendChild(div);
let remove = document.body.removeChild;
remove(div);
Здесь (как и у Вас) метод removeChild
вызывается в контексте window
, у которого, конечно, нет child-а div
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть 2 кнопки, каждая отвечает за срабатывание своей части контента, подскажите как это компактно оформить, чтобы не копировать одно и тоже...
Нужно чтобы этот скрипт не выдавал alert("Ничего не найдено, проверьте правильность ввода!"), когда введено 2 и более слов