五 JavaScript基础之ECMAScript 函数

58 阅读1分钟

函数

抽取封装 重复利用执行特定任务的公共代码块

function 带小括号()的都是函数

声明函数

function sayHi(){函数体}

        function sayHi(){
            console.log('你好世界');
        }
        sayHi()

函数名命名

小驼峰 前缀为动词 如can has is get set load say add getNames() addSquares()

调用函数

函数名() sayHi()

       //函数封装九九乘法表
       function getMultiplication(){
            for(i=1;i<=9;i++){
            for(j=1;j<=i;j++){
                document.write(`${i}*${j}=${i*j}&nbsp;`)
            }
            document.write(`<br/>`)
           }
        }
        getMultiplication() 

函数传参

function 函数名(形参1,形参2){函数体}

调用函数 函数名(实参1,实参2)

开发中保持形参和实参个数一致 声明是形参 调用是实参
封装函数先找调用的函数

参数默认值 undefined 无实参则输出NaN

防止报错需给形参默认值 (形参1=0,形参2=0) 数组则 (形参=[])

        //函数封装传参求1-50累加和
        function getSums(start,end){
        let sum = 0
        for(i=start;i<=end;i++){
           sum +=i
        }
        console.log(sum);
        }
        getSums(1,50);
        //函数封装求累加和 实参为变量
        function getSum(n=0,m=0){
           let sum = 0
           for(i=n;i<=m;i++){
              sum+=i
           }
           console.log(sum);
        }
        let num1= +prompt('请输入起始数字')
        let num2= +prompt('请输入终止数字')
        getSum(num1,num2) 

函数返回值

关键字return

return返回后立即结束函数, return的下一行代码不会被执行

        //函数封装求两数最大值
        function isMax(a,b){
            return a>b?a:b
        }

        let num1 = prompt('请输入第1个数')
        let num2 = prompt('请输入第2个数')
        let max = isMax(num1,num2)
        console.log(max); 
        //函数求数组的最大值与最小值 多个数据用数组
        function getArrValue(arr=[]){
            let max = arr[0]
            let min = arr[0]
           for(i=0;i<arr.length;i++){
                 if(max<arr[i]){
                    max = arr[i]
                 }
                 if(min>arr[i]){
                    min = arr[i]
                 }
           }
           return [max,min] //return返回多个数据 用数组的形式
        }
        let newArray = getArrValue([9,8,29,48,58,2948,657,3])
        console.log(newArray);
        console.log(`数组的最大值是:${newArray[0]}`)
        console.log(`数组的最小值是:${newArray[1]}`) 

作用域

代码可用性的范围

全局作用域:整个<script>内部</script> 外部引入的独立js文件 全局变量:函数外声明的变量

局部作用域:函数作用域/函数内部 局部变量:函数内声明的变量

全局变量和局部变量命名相同不同的作用域下没有影响
作用域链中变量名相同执行时,先局部后全部, 采用就近原则,一层一层作用域查找

匿名函数

function(){}

具名函数 function fn(){}

函数表达式

将匿名函数赋值给变量,通过变量名称进行调用;使用场景web API中

     //先声明
     let fn = function(){}  
     //后调用
     fn() 

立即执行函数

不需要调用立即执行,防止变量名污染

多个立即执行函数用逗号隔开,具名函数也可用该方式调用

//两种写法
   (function(){ })(),
   
   function(){ }()),

逻辑中断

存在于逻辑运算符 && ||

&&左边为false则中断 (两边都为真输入最后的值)

||左边为true则中断 (两边都为真输出前面的值)

           //没有实参程序不报错
           function fn(x,y){
                 x=x || 0 
                 y=y || 0
           } 
           fn() 

转换为boolean型

显式转换

'' 0 undefined null false NaN 转换后布尔型为false

'' 0 undefined null NaN打印输出时为原值

隐式转换

@1.undefined做任何+-操作结果是NaN NaN任意操作结果为NaN

@2.' '空字符串 + -操作时转换为0

@3.null数字操作时转换为0

函数案例--将秒数转换为时分秒

       //函数封装转换秒数
       let second =  +prompt('请输入秒数')
       function getTime(t){
        let h = parseInt(t/60/60%24)
        let m = parseInt(t/60%60)
        let s = parseInt(t%60)
        h=h<10?'0'+h:h
        m=m<10?'0'+m:m
        s=s<10?'0'+s:s
        return `${h}${m}${s}秒`
       }
       
        let str = getTime(second)
        document.write(str)

函数案例--交换两个数的值

        function changeNum(x,y) {
           //声明临时变量
            let temp = x
            x = y 
            y = temp 
            document.write(`第一个值的结果是${x} <br> 第二个值的结果是${y}`)
        }
        changeNum(3,4)

函数案例--判断数组求和或平均值

      //flag形参默认为true
       function handleData(arr,flag=true){
            let sum = 0
           for(i=0;i<arr.length;i++){
               sum += arr[i]
           }
            if(flag){
             //flag为真求数组和
                return sum
            }else{
            //flag为假求平均值
            return parseInt(sum /arr.length)
            }
        }
        let a = handleData([48,29,49,30,45,2,45],false)
        console.log(a);

函数案例--判断元素是否在数组中,存在输出true,不存在输出false

        function some(ele,arr=[]){
            //声明开关变量flag为false
            let flag = false
            for(i=0;i<arr.length;i++){
                if(ele === arr[i]){
                    flag = true
                    break
                }
            }
            return flag
        }
        console.log(some(0,[2,3,4,5,6,7]))  //flase

函数案例 -- 判断元素是否存在,存在输出元素下标号,不存在输出-1

        function findIndex(ele,arr=[]){
            let index = -1
            for(i=0;i<arr.length;i++){
                if(ele === arr[i]){
                    index = i
                    break
                }
            }
            return index
       }
       let a = findIndex(28,[98,85,38,9,5,28,2983])
       console.log(a); //5