我正在阅读this example并且我坚持理解一行。我需要了解一切,所以我无法继续前进。
此函数应隐藏对象内的所有元素。它应该工作。但对我来说,for循环看起来像是无限的。为什么不呢?
getChild: function (i) {
return this.children[i];
},
hide: function () {
for (var node, i = 0; node = this.getChild(i); i++) {
node.hide();
}
this.element.hide(0);
},
从我看到的,该函数使用getChild(0)获取对象的第一个元素,然后再次在该0维对象上调用hide。然后它重置计数器(i)并获取0维对象的第一个元素(它是相同的0-dim对象)并再次调用该函数。
我知道我错了,但这就是我所看到的。请告诉我光明!感谢
答案 0 :(得分:7)
在如上所述的for
循环中,第一位(var node, i = 0
)仅在循环开始时执行一次。当中间部分(node = this.getChild(i);
)返回false时,循环停止执行。如果索引getChild
没有任何内容,i
将返回false。 (从技术上讲,它会返回undefined
,但在这种情况下等于false
。
其次,即使在for循环中调用hide()
,i
也不会重置。为什么?此递归调用会创建与原始实例分开的hide()
的新实例。新hide()
中的所有变量都与原始变量分开。 (等等,沿着兔子洞)。
有关for循环的详细信息,请参阅http://www.tizag.com/javascriptT/javascriptfor.php。
答案 1 :(得分:2)
每次迭代都不会重置变量i
。唯一可以重新执行的操作是布尔表达式和i++
。 node.hide()
与this.hide()
不同。后者是一种被称为不同的功能。如果它是相同的函数,那么是的,会有一个无限循环。
“外部”隐藏功能用于“隐藏”this.getChild(i)
中的所有元素。 node.hide()
会在这些元素上调用hide()
方法,以便隐藏它们。没有无限循环,因为node.hide()
,虽然它与它所使用的函数同名,但是不是相同的函数。
答案 2 :(得分:0)
代码
node.hide();
仍然是树的成员,仍然可以遍历。它只是隐藏而不被显示。
for循环的初始化部分
var node, i=0
在循环开始之前只执行一次。
条件
node = this.getChild(i)
当存在子节点时求值为true(非null),并且当子节点用完时为false(null),从而断开循环。
答案 3 :(得分:0)
如果i
没有孩子,getChild
将返回undefined
并退出循环。
考虑文章中的以下文字:
现在创建GalleryImage类。请注意,它使用与GalleryComposite完全相同的所有方法。换句话说,它们实现相同的接口,除了图像是叶子,因此它实际上没有为关于子项的方法做任何事情,因为它不能有任何。使用相同的接口是复合工作所必需的,因为复合元素不知道它是在添加另一个复合元素还是叶子,所以如果它试图在其子元素上调用这些方法,它需要工作而没有任何错误。 / p>
考虑GalleryImage
的构造函数:
var GalleryImage = function (src, id) {
this.children = [];
this.element = $('<img />')
.attr('id', id)
.attr('src', src);
}
如何构建图像和复合材料:
var container = new GalleryComposite('', 'allgalleries');
var gallery1 = new GalleryComposite('Gallery 1', 'gallery1');
var gallery2 = new GalleryComposite('Gallery 2', 'gallery2');
var image1 = new GalleryImage('image1.jpg', 'img1');
var image2 = new GalleryImage('image2.jpg', 'img2');
var image3 = new GalleryImage('image3.jpg', 'img3');
var image4 = new GalleryImage('image4.jpg', 'img4');
gallery1.add(image1);
gallery1.add(image2);
gallery2.add(image3);
gallery2.add(image4);
container.add(gallery1);
container.add(gallery2);
由于图像不能包含子图像,因此this.children
将保留为空数组。因此,当最终在图像上调用hide
函数时(在复合树的一个叶子上),循环将尝试评估将返回this.children[0]
的{{1}}。这将导致代码undefined
计算为“false”值,并且特定的node = this.getChild(i)
循环将终止。从而防止无限循环。