js-函数-arguments-函数的使用-函数作用域-变量-作用域-预解析

函数

函数就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用

函数的使用

声明+调用     函数不调用,自己不执行

// 函数使用分为两步: 声明函数 和 调用函数
        // 1. 声明函数
        // function 函数名() {
        //     // 函数体
        // }
        function sayHi() {
            console.log('hi~~');
        }
        // (1) function 声明函数的关键字 全部小写
        // (2) 函数是做某件事情,函数名一般是动词 sayHi 
        // (3) 函数不调用自己不执行
        // 2. 调用函数
        // 函数名();
        sayHi();
        // 调用函数的时候千万不要忘记加小括号

函数的封装

是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口

案例1

        // 利用函数计算1-100之间的累加和 
        // 1. 声明函数
        function getSum() {
            var sum = 0;
            for (var i = 1; i <= 100; i++) {
                sum += i;
            }
            console.log(sum);
        }
        // 2. 调用函数
        getSum();

函数的参数

  • 形参:函数定义时设置接收调用时传入

  • 实参:函数调用时传入小括号内的真实数据

  • 参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。

    函数参数的运用:

    // 带参数的函数声明
    function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔
      // 函数体
    }
    // 带参数的函数调用
    函数名(实参1, 实参2, 实参3...); 

        调用的时候实参 值是传递给形参的

        形参简单理解为:不用声明的变量

        实参和形参的多个参数之间用逗号(,)分隔

        // 2. 我们可以利用函数的参数实现函数重复不同的代码
        // function 函数名(形参1,形参2...) { // 在声明函数的小括号里面是 形参 (形式上的参数)

        // }
        // 函数名(实参1,实参2...); // 在函数调用的小括号里面是实参(实际的参数)
        // 3. 形参和实参的执行过程
        function cook(aru) { // 形参是接受实参的  aru = '酸辣土豆丝' 形参类似于一个变量
            console.log(aru);

        }
        cook('酸辣土豆丝');
        cook('大肘子');
        // 4. 函数的参数可以有,也可以没有个数不限

案例

        // 1. 利用函数求任意两个数的和
        function getSum(num1, num2) {
            console.log(num1 + num2);

        }
        getSum(1, 3);
        getSum(3, 8);
        // 2. 利用函数求任意两个数之间的和
        function getSums(start, end) {
            var sum = 0;
            for (var i = start; i <= end; i++) {
                sum += i;
            }
            console.log(sum);

        }
        getSums(1, 100);
        getSums(1, 10);
        // 3. 注意点
        // (1) 多个参数之间用逗号隔开
        // (2) 形参可以看做是不用声明的变量

实参形参个数不匹配

 函数返回值

return语句

返回值:函数调用整体代表的数据;函数执行完成后可以通过return语句将指定数据返回。

// 声明函数
function 函数名(){
    ...
    return  需要返回的值;
}
// 调用函数
函数名();    // 此时调用函数就可以得到函数体内return 后面的值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        // 1.函数是做某件事或者实现某种功能
        // function cook(aru) {
        //     console.log(aru);

        // }
        // cook('大肘子');
        // 2. 函数的返回值格式
        // function 函数名() {
        //     return 需要返回的结果;
        // }
        // 函数名();
        // (1) 我们函数只是实现某种功能,最终的结果需要返回给函数的调用者函数名() 通过return 实现的
        // (2) 只要函数遇到return 就把后面的结果 返回给函数的调用者  函数名() = return后面的结果
        // 3. 代码验证
        function getResult() {
            return 666;
        }
        getResult(); // getResult()   = 666
        console.log(getResult());

        function cook(aru) {
            return aru;
        }
        console.log(cook('大肘子'));
        // 4. 求任意两个数的和
        function getSum(num1, num2) {
            return num1 + num2;
        }
        console.log(getSum(1, 2));
    </script>
</head>

<body>

</body>

</html>

案例

        // 1.利用函数 求两个数的最大值
        function getMax(num1, num2) {
            // if (num1 > num2) {
            //     return num1;
            // } else {
            //     return num2;
            // }
            return num1 > num2 ? num1 : num2;
        }
        console.log(getMax(1, 3));
        console.log(getMax(11, 3));


        //2.数组最大值
        function getArrMax(arr) { // arr 接受一个数组  arr =  [5,2,99,101,67,77]
            var max = arr[0];
            for (var i = 1; i <= arr.length; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            return max;
        }
        // // getArrMax([5, 2, 99, 101, 67, 77]); // 实参是一个数组送过去
        // // 在我们实际开发里面,我们经常用一个变量来接收 函数的返回结果 使用更简单
        // // var re = getArrMax([5, 2, 99, 101, 67, 77]);
        var re = getArrMax([3, 77, 44, 99, 143]);
        console.log(re);

return 会终止函数:在使用 return 语句时,函数会停止执行,并返回指定的值

 <script>
        // 函数返回值注意事项
        // 1. return 终止函数
        function getSum(num1, num2) {
            return num1 + num2; // return 后面的代码不会被执行
            alert('我是不会被执行的哦!')
        }
        console.log(getSum(1, 2));
        // 2. return 只能返回一个值
        function fn(num1, num2) {
            return num1, num2; // 返回的结果是最后一个值
        }
        console.log(fn(1, 2));

        // 3.  我们求任意两个数的 加减乘数结果,采用数组
        function getResult(num1, num2) {
            return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
        }
        var re = getResult(1, 2); // 返回的是一个数组
        console.log(re);

        // 4. 我们的函数如果有return 则返回的是 return 后面的值,如果函数么有 return 则返回undefined
        function fun1() {
            return 666;
        }
        console.log(fun1()); // 返回 666
        function fun2() {
        }
        console.log(fun2()); // 函数返回的结果是 undefined
    </script>

break ,continue ,return 的区别

  • break :结束当前的循环体(如 for、while)

  • continue :跳出本次循环,继续执行下次循环(如 for、while)

  • return :不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码

arguments使用

只有函数有argumrnts对象,当不确定有多少个参数传递的时候,可以用 arguments 来获取。JavaScript 中,arguments实际上它是当前函数的一个内置对象所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参arguments展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:

  • 具有 length 属性

  • 按索引方式储存数据

  • 不具有数组的 push , pop 等方法

注意:在函数内部使用该对象,用此对象获取函数调用时传的实参。

案例:

        // 利用函数求任意个数的最大值
        function getMax() { // arguments = [1,2,3]
            var max = arguments[0];
            for (var i = 1; i < arguments.length; i++) {
                if (arguments[i] > max) {
                    max = arguments[i];
                }
            }
            return max;
        }
        console.log(getMax(1, 2, 3));
        console.log(getMax(1, 2, 3, 4, 5));
        console.log(getMax(11, 2, 34, 444, 5, 100));

函数案例

        // // 利用函数翻转任意数组 reverse 翻转
        function reverse1(arr) {
            var newArr = [];
            // console.log(arguments[0].length-1);
            for (var i = arr.length - 1; i >= 0; i--) {
                newArr[newArr.length] = arr[i];
            }
            return newArr;
        }
        var arr1 = reverse1([1, 3, 4, 6, 9]);
        console.log(arr1);
        var arr2 = reverse(['red', 'pink', 'blue']);
        console.log(arr2);


        // 利用函数冒泡排序 sort 排序
        function sort(arr) {
            for (var i = 0; i < arr.length - 1; i++) {
                for (var j = 0; j < arr.length - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        var temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
        }
        var arr1 = sort([1, 4, 2, 9]);
        console.log(arr1);
        var arr2 = sort([11, 7, 22, 999]);
        console.log(arr2);


        // 利用函数判断闰年
        function isRunYear(year) {
            // 如果是闰年我们返回 true  否则 返回 false 
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }
        console.log(isRunYear(2000));
        console.log(isRunYear(1999));

函数的调用

 function fn1() {
            console.log(111);
            fn2();
            console.log('fn1');
        }

        function fn2() {
            console.log(222);
            console.log('fn2');
        }
        fn1();

案例

        // 用户输入年份,输出当前年份2月份的天数
        function backDay() {
            var year = prompt('请您输入年份:');
            if (isRunYear(year)) { // 调用函数需要加小括号
                alert('当前年份是闰年2月份有29天');
            } else {
                alert('当前年份是平年2月份有28天');
            }
        }
        backDay();


        // 判断是否为闰年的函数
        function isRunYear(year) {
            // 如果是闰年我们返回 true  否则 返回 false 
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }

函数的两种声明方式

        // 函数的2中声明方式
        // 1. 利用函数关键字自定义函数(命名函数)
        function fn() {

        }
        fn();
        // 2. 函数表达式(匿名函数) 
        // var 变量名 = function() {};
        var fun = function(aru) {
            console.log('我是函数表达式');
            console.log(aru);
        }
        fun('pink老师');
        // (1) fun是变量名 不是函数名  
        // (2) 函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值 而 函数表达式里面存的是函数
        // (3) 函数表达式也可以进行传递参数 

作用域

1.JavaScript作用域 : 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突

2. js的作用域(es6)之前 : 全局作用域   局部作用域

3. 全局作用域: 整个script标签 或者是一个单独的js文件

4. 局部作用域(函数作用域) 在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用

        var num = 10;
        var num = 30;
        console.log(num);//30
        function fn() {
            // 局部作用域
            var num = 20;
            console.log(num);
        }
        fn();//20

变量的作用域

全局变量

1.全局作用域下声明的变量(作用于整个页面)

2.在函数内部不加 var 声明 的变量,也是全局变量

局部变量

1.在函数内部声明的变量 -- 只能在函数内部生效。

2.函数的形参也是局部变量 -- 只能在函数内部生效。

全局变量和局部变量特点:

1.全局变量供全局使用 -- 常驻内存。

2.全局变量 -- 函数内部可以使用外面的全局变量,但是全局作用域下,不能使用函数内部加var的变量。

3.函数局部变量,在函数调用完毕之后 -- 直接销毁。

暂时了解:在es6之前是没有块级作用域的。

        // 决定循环命运的是,判断条件是否成立(true)      跟变量没有关系
        for (var num = 0; num < 10; num++) {
            console.log(num);
        }
        console.log('------------------------------------');
        // 外部最终的num结果是?10 
        console.log(num);


        // 注意:不是函数。我们在if分支花括号里面  定义了一个变量 
        // es6 之前没有块级作用域问题
        // if (true) {
        //     var a = 20;
        //     console.log(a);// 20
        // }

        // console.log(a);//20

  作用域链

函数在访问某个变量时,会优先在自身查找引用,如果自身没有,就会沿着作用域范围往上查找,形成链式查找 -- 作用域链。

 // 1.JavaScript作用域 : 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突
        // 2. js的作用域(es6)之前 : 全局作用域   局部作用域 
        // 3. 全局作用域: 整个script标签 或者是一个单独的js文件
         // 4. 局部作用域(函数作用域) 在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用
       var num = 10;
        var num = 30;
        console.log(num);
        function fn() {
            // 局部作用域
            var num = 20;
            console.log(num);
        }
        fn();

案例

      // 案例2 :结果是几?
        var a = 1;

        function fn1() {
            var a = 2;
            var b = '22';
            fn2();

            function fn2() {
                var a = 3;
                fn3();

                function fn3() {
                    var a = 4;
                    console.log(a); //a的值 ? 4
                    console.log(b); //b的值 ? 22
                }
            }
        }
        fn1();

预解析

JS中先预解析,再代码执行

1. 我们js引擎运行js 分为两步:  预解析  代码执行
(1). 预解析 js引擎会把js 里面所有的 var  还有 function 提升到当前作用域的最前面
(2). 代码执行  按照代码书写的顺序从上往下执行
2. 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
 (1) 变量提升 就是把所有的变量声明提升到当前的作用域最前面  不提升赋值操作
 (2) 函数提升 就是把所有的函数声明提升到当前作用域的最前面  不调用函数

        // 2
        console.log(num); // undefined  坑 1
        var num = 10;
        // 相当于执行了以下代码
        // var num;
        // console.log(num);
        // num = 10;


        // 3  
        function fn() {
            console.log(11);
        }
        fn();


        // 4
        fun(); // 报错  坑2 
        var fun = function () {
            console.log(22);
        }
            // 函数表达式调用必须写在函数表达式的下面
            // 相当于执行了以下代码
            // var fun;
            // fun();
            // fun = function() {
            //         console.log(22);
            //  }

案例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        // 预解析案例
        // 案例1
        var num = 10;
        fun();
        function fun() {
            console.log(num);  
            var num = 20;
        }
        console.log("-------------------");
        // // 相当于执行了以下操作
        // // var num;

        // // function fun() {
        // //     var num;
        // //     console.log(num);  undefined
        // //     num = 20;
        // // }
        // // num = 10;
        // // fun();
        // // 案例2
        var num = 10;

        function fn() {
            console.log(num);
            var num = 20;
            console.log(num);
        }
        fn();
        console.log("-------------------");
        // // 相当于以下代码
        // // var num;

        // // function fn() {
        // //     var num;
        // //     console.log(num); undefined
        // //     num = 20;
        // //     console.log(num);  20
        // // }
        // // num = 10;
        // // fn();
        // // 案例3
        var a = 18;
        f1();
        function f1() {
            var b = 9;
            console.log(a);
            console.log(b);
            var a = '123';
        }
        console.log("-------------------");
        // 相当于以下代码
        // var a;

        // function f1() {
        //     var b;
        //     var a;
        //     b = 9;
        //     console.log(a);  undefined 
        //     console.log(b);  9
        //     a = '123';
        // }
        // a = 18;
        // f1();
        


        // 案例4
        f1();
        console.log(c);
        console.log(b);
        console.log(a);

        function f1() {
            var a = b = c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
console.log("-------------------");

        // 以下代码
        // function f1() {
        //     var a;
        //     a = b = c = 9;
        //     // 相当于 var  a  = 9; b = 9; c = 9; b 和 c 直接赋值 没有var 声明 当 全局变量看
        //     // 集体声明  var a = 9, b = 9, c = 9;
        //     console.log(a);
        //     console.log(b);
        //     console.log(c);
        // }
        // f1();
        // console.log(c);
        // console.log(b);
        // console.log(a);
    </script>
</head>

<body>

</body>

</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值