while的用法

来源:4-4 如何判断节点的包含关系contains

Siio

2015-11-14 22:28

while((b=b.parentNode)){}是理解成b!==a; b=b.parentNode;!!?

写回答 关注

3回答

  • 绯红卷千红
    2015-11-18 14:51:58
    已采纳

    判断循环是否需要继续进行的条件并不一定是b!==a 注意老师的代码写在了try catch块中 这里我写了个简单的测试

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>null or exception test</title>
    </head>
    <body>
        <h1 id="header">Test</h1>
    </body>
    <script>
        var node = document.getElementById("header");
     while(true){
            try{
                console.log(node = node.parentNode);
     }catch(e){
                console.log(e);
     break;
     }
        }
        console.log("-------------end------------");
    </script>
    </html>

    控制台运行结果如下

    http://img.mukewang.com/564c1cfb00011bf804620147.jpg

    可以看到HTMLDocument的父节点为null,在老师的代码中,当【b=HTMLDocument】时,再执行while(  (b=b.parentNode) ),即执行了while(null),此时循环条件不满足,程序不进入循环向下执行return false

    另外通过test的运行结果可以看到对null使用parentNode会抛异常

    所以你的问题while((b=b.parentNode)){}应当理解成 在不抛出异常的情况下,if( b || (b!==a) ) ; b=b.parentNode;


    Siio

    非常感谢!^_^

    2015-11-26 11:09:31

    共 1 条回复 >

  • IT_YUAN
    2016-04-06 13:33:48

    总觉得a,b写反了,难道不是while((a=a.parentNode)),再判断b===a,如果相等则true =>b包含a,,,,不懂,如果老师的是对的,那就是我理解错了,但是这里理解不了啊,求解答,谢谢

    suiye1...

    b是子节点,b=b.parentNode,即b的父节点赋值给b 如果赋值后的b==a,那么就说明赋值前的b是a的子节点,a是b的父节点。

    2016-05-22 05:59:16

    共 1 条回复 >

  • 阿辉2
    2015-11-22 21:53:43

    很简单,(b=b.parentNode)这是一个赋值操作,把b.parentNode赋值给b,而不是判断语句,先赋值,然后判断(b=b.parentNode)这个整体,也就是b的父元素是否存在,如果存在,继续执行下面的判断:a==b,如果直至循环最后抛出异【null.parentNode不存在】a仍然不等于b,说明a不含b

    Siio

    感谢你,讲解的很明白!

    2015-11-26 11:10:32

    共 1 条回复 >

DOM探索之基础详解篇

要知道前端大牛都是从精通DOM开始的,全面讲解DOM的基础知识

98374 学习 · 238 问题

查看课程

相似问题