childNodes динамическая структура же, когда в цикле удаляешь элементы, length меняется
function normalize(element) {
var i, textNodes = [];
(function (element) {
var i, node, nodes = element.childNodes, length = nodes.length;
for (i = 0; i < length; i++) {
node = nodes[i];
if (node.nodeType == 3 && !node.nodeValue) {
textNodes.push(node);
} else if(node.hasChildNodes()) {
arguments.callee(node);
}
}
})(element);
for (i = 0; i < textNodes.length; i++) {
textNodes[i].parentNode.removeChild(textNodes[i]);
}
}
normalize(document.body);
И у текстовых узлов нет геттеров innerText и textContent