为什么这不是无限循环?

时间:2012-11-14 21:50:53

标签: javascript

我正在阅读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对象)并再次调用该函数。

我知道我错了,但这就是我所看到的。请告诉我光明!感谢

4 个答案:

答案 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)

  1. 代码

    node.hide();

    仍然是树的成员,仍然可以遍历。它只是隐藏而不被显示。

  2. for循环的初始化部分

    var node, i=0

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

  3. 条件

    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)循环将终止。从而防止无限循环。