原文
大纲
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的语句越少越好,虽然同样都可以解决问题,但是改造之后的函数相对于原函数不确定性,性能等都可能有极大的问题。