当函数程序运行后的结果外部需要使用的时候,我们不能直接给与,需要通过return返回。
函数内部,return后面的值就是返回值,将函数执行后剩下的结果返回给主调
JavaScript中函数返回值的特点如下:
1. 如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined
2. 如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值
3. 如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined
4. 函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行,所以函数返回至具有切断函数执行的功能。
拿以下例题进行说明:
例一:求圆的周长和面积,代码实现如下:
<script type="text/javascript">
var Perimeter=getPerimeterCircle(1);
var Area=getAreaCircle(1);
function getPerimeterCircle(r){
// var pi=Math.PI;
// var perimeter=2*pi*r;
// return perimeter;
return 2*Math.PI*r;
}
function getAreaCircle(r){
// var pi=Math.PI;
// var area=pi*Math.pow(r,2);
// return area;
return Math.PI*Math.pow(r,2);
}
console.log(Perimeter);
console.log(Area);
</script>
代码中注释部分为详细解题过程,利用返回值大大减少了代码量。
例二:求3个数中的最大值,代码实现如下:
<script type="text/javascript">
function Max(a,b,c){
var max=a;
if(b>max){
max=b;
}else if(c>max){
max=c;
}
return max;
}
console.log(Max(0,45,-1));
</script>
对以上代码,利用三目运算可以大大减少代码量,将条件利用三目表达式体现,如下代码:
<script type="text/javascript">
function Max(a,b,c){
return (a>b?a:b)>c?(a>b?a:b):c;
}
console.log(Max(0,45,-1));
</script>
例三:求一组数中的最大值,代码实现如下:
<script type="text/javascript">
var arr=[-3,-2,-1,0,1,2,3];
var maxValue=Max(arr);
function Max(array){
var max=array[0];
for(var i=1;i<array.length;i++){
if(array[i]>max){
max=array[i];
}
}
return max;
}
console.log(maxValue);
</script>
在此程序中,应特别注意函数部分一定应用的是形参,而不是实参,return返回值一定要在整个功能代码块执行完后加上返回值。
例四:翻转数组,返回一个新数组,代码实现如下:
方法一:定义一个新数组,优点是不破坏原数组,方便下次利用原数组
<script type="text/javascript">
var arr1=[3,2,5,8,4,7,6,9];
var arr=Reversal(arr1);
function Reversal(array){
var arr2=[];
for(var i=array.length-1;i>=0;i--){
arr2[array.length-1-i]=array[i];
}
return arr2;
}
console.log(arr);
</script>
方法二:直接在原数组上进行改变,优点减少变量,提高效率
<script type="text/javascript">
var arr1=[3,2,5,8,4,7,6,9];
var arr=Reversal(arr1);
function Reversal(array){
for(var i=0;i<array.length/2;i++){
var temp=array[i];
array[i]=array[array.length-1-i];
array[array.length-1-i]=temp;
}
return arr2;
}
console.log(arr);
</script>
方法三:不需要函数返回值,直接函数调用
<script type="text/javascript">
var arr1=[3,2,5,8,4,7,6,9];
console.log(arr1);
Reversal(arr1);
console.log(arr1);
function Reversal(array){
for(var i=0;i<array.length/2;i++){
var temp=array[i];
array[i]=array[array.length-1-i];
array[array.length-1-i]=temp;
}
}
</script>
例五: 对数组排序,从小到大,代码实现如下:
<script type="text/javascript">
var arr=[1,2,3,4,4,4,5,678,4];
var arr1=Sort(arr);
function Sort(array){
for(var i=0;i<array.length-1;i++){
var flag=true;
for(var j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
var temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=false;
}
}
if(flag){
return array;
}
}
}
console.log(arr1);
</script>
对以上数列实现冒泡排序,设置外循环和内循环来确保排序的正确性,设置flag标志以提高程序效率
例六:求阶乘,代码实现如下:
<script type="text/javascript">
var product=Factorial(100);
function Factorial(n){
var Product=1;
for(var i=2;i<n+1;i++){
Product*=i;
}
return Product;
}
console.log(product);
</script>
例七:求1!+2!+3!+....+n!(函数嵌套)
方法一:内层循环保证阶乘实现,外层循环保证阶乘加和来求出阶乘的和
<script type="text/javascript">
var Sum=Factorial(5);
function Factorial(n){
var sum=0;
for(var i=1;i<n+1;i++){
var Product=1;
for(var j=1;j<i+1;j++){
Product*=j;
}
sum+=Product;
}
return sum;
}
console.log(Sum);
</script>
方法二:函数方法嵌套和调用,在加和函数块中调用阶乘函数块
<script type="text/javascript">
console.log(getSumJC(4));
function getJC(number) {
var Product=1;
for(i=1;i<number+1;i++){
Product*=i;
}
return Product;
}
function getSumJC(number){
var sum=0;
for(var i=1;i<=number;i++){
sum+=getJC(i);
}
return sum;
}
</script>
例八:判断一个数是否是素数
方法一:判断一个数是否是素数,可以从2到本身-1范围内开始判断(最小质数为2),如果使范围优化,可以将其范围缩小至原来范围的1/2;代码实现如下:
<script type="text/javascript">
var bool=true;
var Bool=Prime(3);
function Prime(n){
for(var i=2;i<=n/2;i++){
if(n%i===0){
bool=false;
}
}
return bool;
}
if(Bool){
alert("此数为素数!!!");
}else{
alert("此数非素数!!!");
}
</script>
方法二:一个数,我们可以拆分成两个数乘积的形式,数与数乘积之间其中两个数相等为其间的平衡点,所以我们可以将其范围缩小为2到这个数的平方根的范围,代码改善后如下:
<script type="text/javascript">
var bool=true;
var Bool=Prime(3);
function Prime(n){
for(var i=2;i<=Math.sqrt(n);i++){
if(n%i===0){
bool=false;
}
}
return bool;
}
if(Bool){
alert("此数为素数!!!");
}else{
alert("此数非素数!!!");
}
</script>
例九:求斐波那契数列Fibonacci中的第n个数是多少?
<script type="text/javascript">
var a=1,b=1,c;
var C=Fibonacci(12);
function Fibonacci(n){
for(var i=3;i<n+1;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
alert(C);
</script>
例十:输入某年某月某日,判断这一天是这一年的第几天?
方法一:先判断是否为闰年,再判断为几月份,加上相应月份天数后加上对应的日子,则为最后结果,代码实现如下:
<script type="text/javascript">
var n1=Number(prompt("请输入年份:"));
var n2=Number(prompt("请输入月份:"));
var n3=Number(prompt("请输入日份:"));
var days=0;
var data=Days(n1,n2,n3);
function Days(n1,n2,n3){
for(var i=1;i<n2;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
days+=31;
}else if(i==4||i==6||i==9||i==11){
days+=30;
}else if(n1%4==0&&n1%100!=0||n1%400==0){
days+=29;
}else{
days+=28;
}
}
days+=n3;
return days;
}
alert("该年第"+data+"天");
</script>
方法二:
1.判断是否是闰年
2.求天数(年判断是否是闰年,月是否超过2月)
(1)把每月的天数组成一个数组,不包含闰年
(2)如果是闰年,而且超过了二月,直接在天数上+1;
<script type="text/javascript">
console.log(getDays(2015,3,1));
function getDays(year,month,day){
var arr=[31,28,31,30,31,30,31,31,30,31,30,31];
//把输入的月份之前的天数放入day中(不包含本月)
//输入的月份我们把它当做当前的索引值用(所以我们要把月份-1,而且不能相等)
for(var i=0;i<month-1;i++){
day=day+arr[i];
}
if(month>2&&isRN(year)){
day+=1;
}
return day;
}
function isRN(year){
// 要有返回值,将来判断是否是闰年,是否超过2月,如果是添加1天
// (四年一闰,百年不闰,四百年再闰)
if(year%4===0&&year%100!==0||tear%400===0){
return true;
}else{
return false;
}
}
</script>
方法三:不利用函数封装,返回值方法,不利用数组解决,代码实现如下,不建议使用:
<script type="text/javascript">
if(n1%4){
for(var i=1;i<n2;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
days+=31;
}else if(i==2){
days+=28;
}else if(i==4||i==6||i==9||i==11){
days+=30;
}
}
}else {
for(var i=1;i<n2;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
days+=31;
}else if(i==2){
days+=29;
}else if(i==4||i==6||i==9||i==11){
days+=30;
}
}
}
alert(days+n3);
</script>