while((b=b.parentNode)){}是理解成b!==a; b=b.parentNode;!!?
判断循环是否需要继续进行的条件并不一定是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>控制台运行结果如下

可以看到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;
总觉得a,b写反了,难道不是while((a=a.parentNode)),再判断b===a,如果相等则true =>b包含a,,,,不懂,如果老师的是对的,那就是我理解错了,但是这里理解不了啊,求解答,谢谢
很简单,(b=b.parentNode)这是一个赋值操作,把b.parentNode赋值给b,而不是判断语句,先赋值,然后判断(b=b.parentNode)这个整体,也就是b的父元素是否存在,如果存在,继续执行下面的判断:a==b,如果直至循环最后抛出异【null.parentNode不存在】a仍然不等于b,说明a不含b