Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这是一个无限JavaScript for循环:can';我无法修复这个错误_Javascript_Html - Fatal编程技术网

为什么这是一个无限JavaScript for循环:can';我无法修复这个错误

为什么这是一个无限JavaScript for循环:can';我无法修复这个错误,javascript,html,Javascript,Html,我正在做一个javascript面试问题,但我无法解决,有人能帮我吗 问题: 函数appendChildren应该向每个现有div添加一个新的子div。应该通过调用decorateDiv来修饰新的div 例如,在执行appendChildren之后,以下div: //案例 document.body.innerHTML=` `;该allDivs列表是一个活动节点列表。这意味着每当您创建一个新的并将其添加到页面时,列表将立即更新以包含该新元素。因此,循环将永远持续下去 您可以在新环境中使用Arr

我正在做一个javascript面试问题,但我无法解决,有人能帮我吗

问题: 函数appendChildren应该向每个现有div添加一个新的子div。应该通过调用decorateDiv来修饰新的div

例如,在执行appendChildren之后,以下div: //案例

document.body.innerHTML=`

`;
allDivs
列表是一个活动节点列表。这意味着每当您创建一个新的
并将其添加到页面时,列表将立即更新以包含该新元素。因此,循环将永远持续下去

您可以在新环境中使用
Array.from()
创建普通阵列副本:

var allDivs = Array.from(document.getElementsByTagName("div"));
或者您可以使用此功能,它可以在任何地方使用:

var allDivs = Array.prototype.slice.call(document.getElementsByTagName("div"));

普通数组当然不会立即更新以包含您创建的每个新的

所有divs
列表是一个活动节点列表。这意味着每当您创建一个新的
并将其添加到页面时,列表将立即更新以包含该新元素。因此,循环将永远持续下去

您可以在新环境中使用
Array.from()
创建普通阵列副本:

var allDivs = Array.from(document.getElementsByTagName("div"));
或者您可以使用此功能,它可以在任何地方使用:

var allDivs = Array.prototype.slice.call(document.getElementsByTagName("div"));

普通数组当然不会立即更新,以包含您创建的每个新

在什么时候
i
false
?也就是说,如果在代码执行时逐行检查代码,为什么您认为循环不应该是无限的?@David那么,添加到DOM将更新节点列表的事实并不十分明显。很久以前,当我得知这一点时,我感到很惊讶;这似乎是一种奇怪的做事方式。在什么情况下,
i
false
?也就是说,如果在代码执行时逐行检查代码,为什么您认为循环不应该是无限的?@David那么,添加到DOM将更新节点列表的事实并不十分明显。很久以前,当我得知这一点时,我感到很惊讶;这似乎是一种非常奇怪的方式,一个更简单的解决方案是缓存节点列表的长度
for(var i=0,len=allDivs.length;i
@skyline3000可能会很好地工作,但列表不一定会将新添加的元素放在末尾。编写代码的方式,它们可能最终会出现在列表的中间。(我很确定这个列表是按照DOM遍历顺序维护的。)我不想在这里引发争论,但说它可能会起作用是完全不正确的——它肯定会起作用。事实上,它的工作方式与您的解决方案相同,因此我不太清楚您为什么会说它可能不起作用。元素的集合是相同的-您的元素不是对DOM的实时引用。这种技术已经存在了很长时间,并且在“高性能JavaScript”等书中有很好的记录。元素不会被添加到列表中间(这根本没有意义)。你可以在这里@skyline3000自己测试它-你的测试太简单了。注意,在fork中,没有新内容添加到元素“c”、“d”或“e”,但新内容添加到生成的元素中。我明白你的意思,我不认为这是OP所要求的(我想我们应该看到OP想要的“c”、“d”、“e”等)。我假设原始树中有更多层次结构,而不是单独的树节点,在这种情况下需要您的解决方案(fwiw
querySelectorAll()
还返回非活动节点列表)。更简单的解决方案是只缓存节点列表的长度
for(var i=0,len=allDivs.length;i
@skyline3000可能会很好地工作,但列表不一定会将新添加的元素放在末尾。编写代码的方式,它们可能最终会出现在列表的中间。(我很确定这个列表是按照DOM遍历顺序维护的。)我不想在这里引发争论,但说它可能会起作用是完全不正确的——它肯定会起作用。事实上,它的工作方式与您的解决方案相同,因此我不太清楚您为什么会说它可能不起作用。元素的集合是相同的-您的元素不是对DOM的实时引用。这种技术已经存在了很长时间,并且在“高性能JavaScript”等书中有很好的记录。元素不会被添加到列表中间(这根本没有意义)。你可以在这里@skyline3000自己测试它-你的测试太简单了。注意,在fork中,没有新内容添加到元素“c”、“d”或“e”,但新内容添加到生成的元素中。我明白你的意思,我不认为这是OP所要求的(我想我们应该看到OP想要的“c”、“d”、“e”等)。我假设原始树中有更多层次结构,而不是单独的树节点,在这种情况下,需要您的解决方案(fwiw
queryselectoral()
还返回一个非活动节点列表)。