2017-01-10 47 views
0

返回true,我有以下的样本文档差(函数()),并在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) 

它显示错误answer.can有人发现两者之间的区别。

+0

我想我得到了这个。通过另一种方式导致函数仅检查树的一条路径。从根到第一个孩子,然后是第一个孩子,等等。 –

+0

return并不是函数的返回函数的函数。 –

+0

您正在评估'return(expression)'而不是'return(function())'。在你的情况下,一个条件表达式,其结果将是一个真/假值;如果你做了'return function.call()',它会导致* truthy *或* falsy *值 – BotNet

回答

1

代码

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

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

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

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

1

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

有一个在伪代码的以下两个块的差异:

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

而且

foreach item in list 
    return f(item) 

第一嵌段将返回true如果任何项目创建一个真实的结果。

根据第一项的结果,第二个块将简单地返回truefalse

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

0

功能talksAbout不返回在所有情况下一个布尔值:如果这个条件满足就会返回一个正整数或-1

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

IndexOf docs

此外,如果这不符合的条件将返回null。当你检查并返回true如果你的返回值(函数())返回函数的返回值,并且正如我上面所解释的那样,你可以确保返回值为booleaninteger或null功能。

如果你想确保你返回一个boolean只是返回,如果在任何情况下在你的功能。

希望它有帮助!