JS函数及简单案例

85 阅读5分钟

什么是函数?-----可以理解为函数是一个盒子。

写一个函数分为两部分:1.定义阶段 2.调用阶段

01-函数的定义

函数有两种定义

声明式定义函数

语法:function 函数名 () {}--------------function是关键字

赋值式定义函数

语法:var 变量名 = function () {}

        /**
        //各个部位的含义
         *  function () {}  ---> 匿名函数
         *      function    关键字, 表明后续紧跟一段代码, 是函数
         *      ()          内部书写, 参数   后续讲,暂时先记住, 暂时理解为 固定写法 
         *      {}          内部书写, 函数调用执行时 的代码(可以理解为 要执行的代码)
         * 
         *  function fn1() {}   ---> 具名函数
         *      funtion     关键字, 同上
         *      fn1         函数名, 将来可以通过 这个名字(变量) 去调用(去找到)本函数
         *      ()          参数, 同上
         *      {}          要执行的代码段, 同上
        */

函数的定义:

        // 赋值式定义
        var fn = function () {}
        console.log(fn)
​
        // 声明式定义
        function fn1() {}
        console.log(fn1)

02-函数的调用

语法:函数名( )

function (a) {
    console.log(111)
}
a()

声明式与赋值式的与别

书写不同

打印时,声明式会带上函数名,赋值式没有

调用时的差异:声明式:可以在函数定义前 调用

        fn1()   // 111
        function fn1() {
            console.log(111)
        }
        fn1()   // 111

03-函数的参数

参数分为两种

形参:函数名后(function)后边的小括号内部,没书写一个,就相当于在函数内部声明一个变量,可以在与函数内部去调用。

实参:调用函数时的小括号内部书写的值,就是实参,实参与形参为一一对应的关系

注意:如果实参数量 少于 形参 那么前边的形参对应接受值,没有对应实参 的 形参在 值 为undefined

如果形参数量 少于 实参 那么会一一对应后,多余的实参无法通过参数获取

        // function fn(a, b, c) {
        //     console.log(a, b, c)
        // }
        // fn(1, 2, 3) // 1 --- 2 --- 3
        // fn(1, 3)    // 1 --- 3 --- undefined
        // fn(2)    // 2 --- undefined --- undefined

04-函数的返回值

语法:return 需要返回的内容

如果我们不写return 函数会默认在代码段最后一行写上 return undefined

什么时候需要写返回值 取决于是否需要得到函数内部某一个变量的值,如果需要 可以使用返回值将其返回,如果不需要可以不写

return具有中断函数的功能----如果不想中断函数,要把return放在函数最后面

        // return 中断函数
        function fn() {
            console.log(1)
            return
            console.log(2)
            console.log(3)
            console.log(4)
            console.log(5)
        }
        fn()

案例1--利用函数判断一个数是不是水仙花数

        function fn(num) {
            // 1. 判断该数字是否为水仙花数
​
            // 1.1 拿到 各个 位置上 的数字
            var baiW = parseInt(num / 100)
            var shiW = parseInt(num % 100 / 10)
            var geW = num % 10
            // 1.2 拿到各个位置上的数字 的 三次方的和
            var sum = baiW ** 3 + shiW ** 3 + geW ** 3
​
            // 2. 如果是水仙花数, 返回 true, 如果不是水仙花数, 返回 false
            if (sum == num) {
                // 是水仙花数
                return true
            } else {
                // 不是水仙花数
                return false
            }
        }
        var bo = fn(153)
        console.log(bo)
​
        var bo1 = fn(666)
        console.log(bo1)

案例2---在1000和2000之间的数字内,求出是4的倍数,且不是100的倍数的数字。

        // function fn(a, b) { // 一定要确保 a 的值 小于 b
        //     var num = 0
        //     for (var i = a; i < b; i++) {
        //         if (i % 4 == 0 && i % 100 !== 0) {
        //             // console.log(i)
        //             document.write(i + ' ')
        //             num++
        //             if (num == 4) {
        //                 document.write('<br>')
        //                 num = 0
        //             }
        //         }
        //     }
        // }
        // fn(3000, 5000)

案例3--计算两个 数的和, 并且在此之前做判断, 如果有一个参数不是 number 类型的 那么停止函数

        function add(a, b) {
            if (typeof a !== "number" || typeof b !== 'number') {
                console.log('参数 a 或者 参数 b 其中有一个 不是 number 类型的, 终止函数运行')
                // 停止函数
                return false
            } else {
                console.log('a + b 的和: ', a + b)
            }
            return a + b
​
        }
​
        add(100, 200)
        add(100, '200')

案例4 ---求质数

        function fn(a) {
            // 1. 判断传入参数是否为质数
            var count = 0   // 计数器
            for (var i = 2; i < a; i++) {
                if (a % i == 0) {
                    count = count + 40  // 只是为了让 count 有变化, 具体+40 还是加多少, 无所谓
                }
            }
​
            // 2. 根据传入的参数决定返回什么值
            if (count == 0) {
                // 应该是 质数
                return true
            } else {
                // 这里 不是 质数
                return false
            }
            // count == 0 ? (return true) : (return false)  // 三目 不能书写 return true 或者 return false
        }
        var a = fn(9)   // 9 不是质数, 所以最终返回值应该是 false
        console.log(a)
​
        var a1 = fn(7)   // 7 是质数, 所以最终返回值应该是 true
        console.log(a1)

05-函数的预解析

函数的预解析,可能会遇上同名变量的变量提升(变量的预解析) 直接以函数为主

在Js中只有变量和函数才会有预解析或者提升

预解析后会把函数提升到当前作用域的最顶层

        /**
         * 
         *  var fn = 'hhh'
            console.log(fn)
​
            fn()   
            function fn() {
                console.log(1)
            }
            fn()   
            
            在 JS 中 只有变量和函数才会有预解析或者 提升
​
            1. var fn = 'hhh'       // 有提升
            2. console.log(fn)      // 没有
​
            3. fn()                 // 没有
            4. function fn() {      // 有提升
                 console.log(1)
                }
            5. fn()                 // 没有
​
            预解析之后
                1. function fn() {
                    console.log(1)
                    }
                2. var fn;  // 没意义
​
                3. fn = 'hhh'   // 这行很重要, 直接将变量内保存的 函数 更改为了 'hhh'
​
                4. console.log(fn)  // 按照分析, 此处应该打印 'hhh'
​
                5. fn()     // 按照分析, 此处 fn 的值应该 'hhh' 所以会报错 fn is not a function
​
                6. fn()     // 按照分析, 此处 fn 的还是 'hhh' ,所以还会报错 fn is not a function
​
        */

\