javascript-函数

一、函数(方法):

1、什么是函数?

函数是一个可以重复使用的程序模块,该程序模块可以完成一个特定的功能

2、函数的定义:

function 函数名(【参数】]){

函数体语句

}

(1)function:是关键字,必须小写

(2)函数名:用户标识符(用户自定义)--- 建议:见名知意

(3)【参数】:'()'不能省略,'参数'是可选的(函数可以有参数,也可以没有参数)

(4)'{}':不能省略,表示函数的控制范围

(5)'函数体语句':实现功能的代码

function getSum(){
     let sum = 0
     for(let i=1;i<=100;i++){
           sum += i
     }
     return sum    //返回
}

3、函数的调用:

(1)带返回值的函数(函数体中有return语句的函数):

let / var 变量 = 函数名(【参数】)

function getSum(){
            let sum = 0
            for(let i=1;i<=100;i++){
                sum += i
            }
            return sum
}
​
let  t = getSum()  //getSum函数中return语句将sum的值返回后赋给变量t
console.log('1+2+3+...+100=',t)

练习1:定义函数,计算1!+2!+3!+4 + 5!

function getSum(){
            let sum = 0
            for(let i=1;i<=5;i++){  //外循环:累加的
                //计算i的阶乘
                let t = 1
                for(let k=1;k<=i;k++){  //内循环:计算当前i的阶乘
                    t *= k
                }
                sum += t
            }
            return sum
        }
​
        function getSum1(){
            let sum = 0;
            let t = 1
            for(let i=1;i<=5;i++){
                t *=i
                sum +=t
            }
            return sum
        }
​
        let k = getSum1()
        console.log("1!+2!+3!+4!+5!=",k)

练习2:定义一个函数,返回所有水仙花数

function getNumber(){
            let arr = []  //用来保存'水仙花'数
            for(let i=100;i<1000;i++){
                //1.拆分三位数
                let g = i%10
                let s = parseInt(i/10)%10
                let b = parseInt(i/100)
                //2.求各位数字的立方和
                if((g**3+s**3+b**3)=== i){
                    arr.push(i)
                }
            }
            return arr
        }
console.log(getNumber())

注意:关于函数的返回值

a、函数是否要返回值由具体的需求决定

b、函数返回值通过return语句来完成。在函数中一旦执行了return语句,当前函数就结束运行

(2)无返回值的函数调用:

函数名(【参数】)

三、函数的参数:函数在运行时需要外部的数据才是实现具体的功能。这个外部的数据就是参数

1、形参:形式参数,是在函数定义时出现在函数首部的参数。形参没有实际值,只是一个占位符

2、实参:实在参数。是函数调用时出现在函数首部的参数,实参表示的是一个实际值

练习3:定义一个函数,计算n!(n的值由外部传入)

//定义一个函数,计算n!
        function getNum(n){  //n是形参,是函数定义时,放在函数名后的'()'中
            let t = 1
            for(let i=1;i<=n;i++){
                t *= i
            }
            return t
        }
​
        let k = 8
        let m = getNum(k) //5是实参。在函数调用时实参传递给形参
        console.log(m)

练习4:定义一个函数,用于输出一个二维数组

function showArray(arr){ //arr是形参
            let str=''
            for(let i=0;i<arr.length;i++){ //外循环:循环变量i是行下标
                for(let j=0;j<arr[i].length;j++){//内循环:循环变量j是列下标
                    str += arr[i][j] + '\t'
                }
                str += '\n'
            }
            console.log(str)
        }
​
        let a1 = [[1,2,3],[4,5,6],[7,8,9]]
        showArray(a1)
​
        let a2 = new Array(new Array(11,22,33,44),new Array(77,88,99,55))
        showArray(a2)

练习5、定义一个函数,用来判断一个数是否是素数,若是素数返回true,若不是返回false

//定义函数:判断一个数是否是素数
        function isPrime(n){  //n是形参
            // let flag = true  //假设n是素数
            for(let i=2;i<n;i++){
                if(n % i == 0){
                    // flag = false
                    // break
                    return false
                }
            }
            return true
        }
​
       //输出100以内的所有素数
       let str = ''
       for(let k=2;k<=100;k++){
          if(isPrime(k)==true){ //k是实参
            str += k+'\t'
          }
       }
       console.log(str)

3、在函数调用时,参数的传递方向是实参--->形参(传递方向是单向的,当形参发生改变后不会影响实参)

//参数传递方向是单向的:实参--->形参
        function swap(x,y){//两个形参,参数之间用逗号分隔
            console.log('形参:x='+x+',y='+y)
            let temp = x
                x = y
                y = temp
            console.log('形参:x='+x+',y='+y)
        }
​
        let a = 5,b = 6
        console.log('实参:a='+a+',b='+b)
        swap(a,b)
        console.log('实参:a='+a+',b='+b)

四、函数参数的数量:在javascript中允许函数的形参与实参不同

1、实参的数量多于形参的数量:函数可以正常运行,多余的实参被忽略

function f1(m,n){ //m、n是形参
            return m+n
        }
​
let t = f1(11,22,33,55) //实参是4个,多余的实参被忽略
console.log(t)

2、实参的数量少于形参的数量:多出的形参是一个已声明未赋值的变量,它的值是undefined

function f2(a,b,c){ //形参是3个,c的值是undefined
            console.log('a='+a+',b='+b+',c='+c)
}
​
f2(123,456) //实参是2个

五、arguments对象的使用

1、是内置对象:已经定好的,用户只要使用即可

2、作用:调用函数时,函数的实参都保存在arguments对象中

练习6:定义一个函数,返回调用该函数时实参的最大值

function getMax(){
            let max = arguments[0] //假设第一个实参是最大的
            for(let i=1;i<arguments.length;i++){
                if(max < arguments[i]){
                    max = arguments[i]
                }
            }
            return max
}
​
let m = getMax(78,45,156,98)
console.log(m)

强调:每个函数内部都有一个arguments对象,本质是一个数组,保存的是调用函数时传递的实参

练习7:定义一个函数,判断一个数是否是'完数'

'完数'是某个数的所有因子(不包含自身)之和等于它本身

function fun(n){  //判断n是否是完数
            let sum = 0  //sum用于累加n的因子
            for(let i=1;i<n;i++){
                if(n % i == 0){ //条件为真,表示i是n的因子
                    sum += i  
                }
            }
            if(sum === n){  //sum存放n的所有因子之和
                return true
            }else{
                return false
            }
}
​
//输出1000以内的所有'完数'
for(let j=1;j<1000;j++){
    if(fun(j)){
       console.log(j)
    }
}

二、函数表达式:将定义的函数赋给一个变量,通过变量完成函数的调用和参数传递(即函数是匿名的)

1、定义

var / let / const 变量名 = function(【参数】){

函数体语句

}

2、调用

变量名(【参数】)

let min = function(val1,val2){
            if(val1 < val2){
                return val1
            }else{
                return val2
            }
        }
        
let  t = min(12,25)
console.log('最小数:',t)

三、函数的递归调用(重点、难点)

1、递归调用:函数自己调用自己(即在函数的函数体语句中调用自己)

2、递归算法:

(1)用递归方式解决问题的前提

a、问题可以进行分解,分解得到的新问题的解法与原问题的解法相同

8! --> 8* 7! --->7 6!-->.......2!-->2 * 1!

b、问题的分解过程必须有明确的结束条件

(2)递归的过程

a、自上而下分解问题:得到最简单的问题的解

b、自下而上回溯得到原问题的解

3、代码实现:

       //用递归函数计算 n!
        function fun(n){
            //1.明确递归结束的条件
            if(n==1){
                return 1
            }else{
                //2.继续分解n
                return n * fun(n-1) //函数自己调用自己:在调用过程分解问题
            }
        }
​
        let m = fun(5)
        console.log('5!=',m)

练习1:定义递归函数,计算1+2+3+...100的值

 ```javascript

//定义递归函数,计算1+2+3+...+100 function fun(n){ //1.明确递归结束的条件 if(n==1){ return 1 }else{ //2.继续分解n return n + fun(n-1) //函数自己调用自己:在调用过程分解问题 } }

         let sum = fun(100)
            console.log(sum)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值