JavaScript的return程序流
原文
简书原文:https://www.jianshu.com/p/cd65a26a5b0c
大纲
1、场景分析
2、代码分析
3、总结分析
1、场景分析
以下有两段代码,这两段代码都可以使用检查输入的字符的大小写的功能,我们可以通过对这两段代码的分析来认识return程序流。
代码一
<html> <head> <script> function checkCarType(charToCheck){ var returnValue = "O"; var charCode = charToCheck.charCodeAt(0); if (charCode >= "A".charCodeAt(0) && charCode <= "Z".charCodeAt(0)){ returnValue = "U"; } else if (charCode >= "a".charCodeAt(0) && charCode <= "z".charCodeAt(0)){ returnValue = "L"; } else if (charCode >= "0".charCodeAt(0) && charCode <= "9".charCodeAt(0)){ returnValue = "N"; } return returnValue; } </script> </head> <body> <script> var myString = prompt("Enter some text " ,"Hello World"); switch (checkCarType(myString)){ case "U": document.write("First character was upper case"); break; case "L": document.write("First character was lower case"); break; case "N": document.write("First character was a number"); break; default: document.write("First character was not a character or a number"); } </script> </body> </html>
代码二
function checkCarType(charToCheck){ var returnValue = "O"; var charCode = charToCheck.charCodeAt(0); if (charCode >= "A".charCodeAt(0) && charCode <= "Z".charCodeAt(0)){ //returnValue = "U"; return "U"; } else if (charCode >= "a".charCodeAt(0) && charCode <= "z".charCodeAt(0)){ //returnValue = "L"; return "L"; } else if (charCode >= "0".charCodeAt(0) && charCode <= "9".charCodeAt(0)){ //returnValue = "N"; return "N"; } //return returnValue; return "O"; }
2、代码分析
第二段代码能够实现和第一段代码同样的功能,但是我们通常推荐使用第一种形式的代码。为什么我们不采用这种方式呢?这种方式的缺点就是在一个函数中使用了多个return语句,这使得函数的执行流难于跟踪。对于一个较小的函数来说,这可能并不是什么大问题,但对于一个较复杂的函数来说,就可能变成一个棘手的问题。采用第一种方式的代码,在函数结束前只有一个唯一的return语句,我们可以非常准确的知道函数将在这个return语句后结束。而对于第二个版本的函数,它具有4个return语句,因此函数可能在任何一个可达的return语句之后结束。这样,函数将具有4个可能的出口和返回位置。这使得对函数中执行流的判断更加麻烦。
3、总结分析
1、一个return代表着一个出口和返回位置。
2、函数最好的形式是一个入口一个出口,从入口进入,执行流执行完所有东西之后从出口中出去。如果一个函数中含有多个return那么在执行流结束之前,函数的执行流都无法知道函数将在哪个return语句结束,使得执行流难以跟踪。
3、因此,return的语句越少越好,虽然同样都可以解决问题,但是改造之后的函数相对于原函数不确定性,性能等都可能有极大的问题。