2

我正在阅读这个例子,但我一直在理解一行。我需要了解一切,所以我不能继续前进。

这个函数应该隐藏对象内的所有元素。它应该可以工作。但对我来说,那个 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 维对象)的第一个元素并再次调用该函数。

我知道我错了,但这就是我所看到的。请给我看光!谢谢

4

4 回答 4

7

for像上面这样的循环中,第一位 ( var node, i = 0) 仅在循环开始时执行一次。当中间部分 ( node = this.getChild(i);) 返回 false 时,循环停止执行。 getChild当 index 没有任何内容时将返回 false i。(从技术上讲,它会返回undefined,但在这种情况下相当于false)。

其次,即使hide()在 for 循环中被调用,i也不会被重置。为什么?这个递归调用创建了一个hide()与原始实例分离的新实例。这个新变量中的所有变量hide()都与原始变量分开。(等等,在兔子洞里)。

有关for 循环的更多信息,请参阅http://www.tizag.com/javascriptT/javascriptfor.php 。

于 2012-11-14T21:52:23.740 回答
2

该变量i不会在每次迭代时重置。唯一递归执行的动作是布尔表达式和i++node.hide()不一样this.hide()。后者是被调用的不同函数。如果它是同一个函数,那么是的,会有一个无限循环。

“外部”隐藏功能用于“隐藏” this.getChild(i). node.hide()将在这些元素上调用该hide()方法,因此它们被隐藏。没有无限循环node.hide(),因为尽管它与正在使用的函数同名,但不是同一个函数。

于 2012-11-14T21:53:00.277 回答
0
  1. 编码

    node.hide();

    仍然是树的成员并且仍然可以遍历。它只是被隐藏而无法显示。

  2. for循环的初始化部分

    var node, i=0

    在循环开始之前只执行一次。

  3. 有条件的

    node = this.getChild(i)

    当有子节点时计算为真(非空),当它的后代用完时计算为假(空),从而跳出循环。

于 2012-11-14T21:53:51.850 回答
0

如果 , 没有孩子igetChild将返回undefined并跳出循环。

考虑文章中的以下文本:

现在创建 GalleryImage 类。请注意,它使用与 GalleryComposite 完全相同的所有方法。换句话说,它们实现了相同的接口,只是图像是一个叶子,所以它实际上并没有为关于孩子的方法做任何事情,因为它不能有任何. 复合元素需要使用相同的接口才能工作,因为复合元素不知道它是添加另一个复合元素还是叶,所以如果它试图在其子元素上调用这些方法,它需要在没有任何错误的情况下工作。

并考虑构造函数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]哪个将返回undefined。这将导致代码node = this.getChild(i)评估为“假”值,并且该特定for循环将终止。从而防止死循环。

于 2012-11-14T21:54:00.803 回答