return(function())之间的差异,并在javascript

时间:2017-01-10 06:19:04

标签: javascript

我有以下示例文档

<!doctype html>
<html>
  <head>
   <title>My home page</title>
  </head>
  <body>
    <h1>My home page</h1>
    <p>Hello, I am Marijn and this is my home page.</p>
    <p>I also wrote a book! Read it
    <a href="http://eloquentjavascript.net">here</a>.</p>
  </body> 
</html>

我写了一个递归函数来找出字符串是否在文档中

function talksAbout(node, string) {


 if(node.nodeType == document.ELEMENT_NODE){
      for(var i=0;i<node.childNodes.length;i++){
       if(talksAbout(node.childNodes[i],string))
         return true;
      }
     return false;
   }
  else if(node.nodeType == document.TEXT_NODE){
     return (node.nodeValue.indexOf(string) > -1);
  }
}

console.log(talksAbout(document.body,"wrote"));

但是当我从

改变第3行中的if语句时
if(talksAbout(node.childNodes[i],string))
   return true;

简单

return taksAbout(node.childNodes[i],string)

它显示错误的答案。有人发现两者之间存在差异。

3 个答案:

答案 0 :(得分:1)

代码

if(talksAbout(node.childNodes[i],string))
   return true;

检查调用的返回值,如果结果为true,则返回true。这样做:

return taksAbout(node.childNodes[i],string)

返回迭代的第一项,而不检查其余项。 ;)

答案 1 :(得分:1)

您有一个简单的流逻辑错误:

以下两个伪代码块存在差异:

 foreach item in list
     if (f(item))
        return true;

 foreach item in list
     return f(item)

如果任何项目创建了真实结果,则第一个块将返回true

第二个块只会返回truefalse,具体取决于第一个项目的结果。

您的更改实际上将您的代码块从第一个示例转换为第二个示例。

答案 2 :(得分:0)

函数talksAbout在所有情况下都不会返回布尔值:

...
else if(node.nodeType == document.TEXT_NODE){
    return (node.nodeValue.indexOf(string) > -1);
}
...

如果满足此条件将返回正整数或-1:

IndexOf docs

如果满足此条件,则返回null。当你检查并返回true时,如果你的返回值(function())返回函数的返回值,你确保返回值为boolean,正如我上面所解释的那样,它可能是boolean integer或您的函数中的null。

如果你想确保在你的职能部门的所有情况下都返回boolean只是返回。

希望它有所帮助!