2021/12/31

2021/12/30

一、js

(1)函数参数

function test(a,b)里面的a,b相当于我在函数里面定义了a,b,只是不赋值。调用test()的时候可以给a,b赋值.

	var aa = Number(window.prompt('a'));
            var bb =Number(window.prompt('b'));
            function test(a,b){ //a,b相当于函数里面定义了a,b

                      console.log(a+b);
            }
            test(aa,bb);

如果这么写,外面的test(aa,bb)不能给a,b赋值.

所以函数给我们的功能,就是让我们能够给函数里面所需要的数据,在调用的时候去赋值

		function test(){ //a,b相当于函数里面定义了a,b
						var a ,b;
                      console.log(a+b);
            }
            test(aa,bb);
1、形参与实参

形参就是占位符实参就是给占位符赋值

新参就是变量实参就是给变量赋上实际的值

1.形参

占位->形式上占位,形式参数(形参)a,b

  function test(a,b){

2.实参

实际参数:aa,bb

 test(aa,bb);

例子:

a输入1,b输入5时候,b-a输出4

var aa = Number(window.prompt('a'));
            var bb =Number(window.prompt('b'));
            function test(a,b){

                      console.log(b-a);
            }
            test(aa,bb);

调换形参test(a,b)位置变成 test(b,a)之后,a输入1,b输入5时 b-a输出-4

 			 var aa = Number(window.prompt('a'));
            var bb =Number(window.prompt('b'));
            function test(b,a){

                      console.log(b-a);
            }
            test(aa,bb);

所以在赋值的时候,参数要一一对应,顺序不能改,不能a对应bb,b对应aa

总结一下:

参数就相当于,函数内部声明的变量(有点像,类似于)

区别在于:参数 可以在函数被调用的时候赋值,而在函数内部声明变量的话,无法在函数被调用的时候赋值

所以说,如果像函数内部的var a,b;要像被赋值,就得变成占位符放到function (a,b){}里面来,这样才能解决,函数调用时,赋值的问题。

2、传参过程

1.在传参的过程中,参数的数据类型不限制,就是任何数据类型都可以往里面传

			var aa = Number(window.prompt('a'));
            var bb =Number(window.prompt('b'));
            function test(a,b){

                      console.log(a,b);
            }
            test(false,null);//false,null

2.形参和实参数量不一样

形参比实参多:

 function test(a,b,c){//岁然c没有定义,但是c已经占位了

                      console.log(a,b,c);//1,2,undefined  
            }
            test(1,2);

实参比形参多:

	function test(a,b){

                      console.log(a,b);//1,2
            }
            test(1,2,3);

总结

函数形参与实参的特征:形参和实参数量可以不等

考虑:在函数内部的时候,我能知道有哪些实参吗?

通过arguments(打印实参)知道有哪些实参

function test(a,b){

              console.log(arguments);
            }
            test(1,2,3);

image-20211230163220103

3.实参数组打印:

 function test(a,b){
              for(var i = 0 ;i<arguments.length;i++){

                console.log(arguments[i]);
              }
              
            }
            test(1,2,3);

image-20211230163630516

4.实参的长度:

 function test(a,b){

                  console.log(arguments.length);//长度为3

                }
                test(1,2,3);

5.形参的长度:

函数名.length

unction test(a,b){

                  console.log(test.length);//长度为2

                }
                test(1,2,3);

6.打印数组指定位置实参数:

function test(a,b){

        console.log(arguments[1]);//2
   }
   test(1,2,3);

7.函数内部给形参赋值,会更改实参的值。即在函数内部,是可以更改实参的值

比如用户输入了不合法的数,我们可以通过判断这个实参的值去更改

 function test(a,b){

        a = 3;
        console.log(a);//输出3
		console.log(arguments[0]);//输出3

    }
    test(1,2);

8.实参并没有传递,在函数内部赋值,不会打印实参

 function test(a,b){

         b=2;
        
            console.log(b);//2
            console.log(arguments[1]);//undefined

    }
    test(1);

总结:

实参里面传值的,可以在函数内部修改这个实参的值

如果在实参里面没有值,在函数内部给形参赋值的,没有用

3、函数例题

1.(输入一串数字累加)一个函数被调用时,累加它的实参,不知道实参有多少个。

		function sum(){    //不能填参数,因为不知道参数多少个不好填,占位都不知道怎么占位
               var count =0; 
            for(var i =0;i<arguments.length;i++){
                count+=arguments[i];

            }
            console.log(count);//110
    }
    sum(10,20,8,9,7,56);
4、映射

下面代码中的arguments[0]a=3不是一个变量和值,不是一个东西
a=3;存在栈内存里面的

arguments[]存在堆内存里面的,它在下面是一个存1和2的一个数组,然后在栈内存,存储这个地址,给一个指针

  function test(a,b){
            a=3;//存在栈内存里面的
        console.log(arguments[0]);//arguments[]存在堆内存里面的

    }
    test(1,2);

但是,虽然实参和形参,虽然不是一个变量,但在函数的基础上,在系统内部,它们是一个映射关系

映射关系解释:

就是说形参和实参,它并不是同一个量,他们是存放在不同地方的,但是系统的设置它们存在着映射关系

也就是说,无论你的实参怎么赋值,你的形参都会跟着变但是必须是形参里面这个数组里面有这个对应的值才行。

如果没有对应的值,没有用,就算在函数里你的形参赋值了,实参输出undefined

但是如果实参和形参的对应关系是存在的,那么他们当中就有必然的映射关系

5、return问题

1.函数执行到最后一行,系统会自己增加一条return语句,并不是没有,是系统增加的

叫隐式添加

function test(a){
           console.log(a);
            //return 中止这个函数的执行
    }
    test(1);

2.return中断函数的执行,return放到哪里,retrun下面的语句是不会执行的

function test(a,b){
           console.log(a);
            return;
    		console.log(b);//不执行
    }
    test(1,2);

3.第一个功能,中断

  function test(name){

            if(!name){

                return;
            }
            console.log(name);//打印出施政             }
  			}      
      test('施政');

4.第二个功能,返回一个值。

返回值过程中,也执行了函数的中止过程

	var name =prompt('请输入您的姓名'); 
    function test(){

            if(!name){

                return '您没有填写姓名';
            }
            return name;
            }
            alert('您的姓名为:'+test(name));//里面没有打印,要在外面打印

5.如果没填写return,不输入姓名

没有一个中止的过程

function test(name){

            if(!name){

          console.log('您没有填写姓名'); 
            }
                    console.log(name); 
            }
            test();

输出:

image-20211230193228643

6.用与或的方式

运算,当前是假,就往后走,

运算,当前是真,往后走

下面用或语句,当前是真的话,就返回name。如果name是假,是空值,则走到您没有填写姓名这一句 字符串是真、

或语句,是遇假就往后走,走到最后无论真假,都返回最后一个

假有undefined null NaN '' 0 false

 var name =prompt('请输入姓名') 
        function test(){
            
                  return  name || '您没有填入姓名'

         }
         console.log(test(name));

8.var再外部是全局变量,在块级作用域中是局部变量

	 var b=2;
            function test(){
                var a =1;
                console.log(b);//打印出2

            }
            test()
			console.log(a);//报错

包到typeof里面就不报错

var b=2;
            function test(){
                var a =1;
                console.log(b);//打印出2

            }
            test()
			console.log(typeof(a));//undefined

9.问a,b c是否能打印

 			var a=1;//全局变量
            function test(){
                var b = 2;//局部变量
                console.log(a);//打印1
            function test2(){

                var c =3;//局部变量 
                a =3;
                console.log(b);//打印2
            }
            test2();
             console.log(c);//报错,未被定义
            }
            test();
			console.log(a)//3
  1. 类似作用域
 function test1(){

                var a = 1;
                console.log(b);//报错

            }
            function test2(){

                var b = 2;
                console.log(a);//报错
            }
            test1();
            test2();
6、函数式编程

计算机里面的函数:固定的功能或者是程序段被封装的过程,

实现一个固定的功能或程序,

在这个封装体中需要一个入口和一个出口,

入口就是参数,出口就是返回 。

函数就像一个盒子,把程序封装起来了。

每次要用程序就调用这个盒子

  function test(str1,str2,str3){

                    console.log(str1);
                    console.log(str2);
                    console.log(str3);
            }
            test(
                '1',
                '2',
                '3'
                     );
 function test(str){

                return str;
            }
            console.log(test('我爱编程'));
7、作业

1.定义一个函数,从wp接收一个饮料的名称,函数返回对应的价格;

  var wp=prompt('请输入饮料的名称');
              function prize(){
                        if (wp=='冰红茶')
                        alert('5元');
                        else if(wp=='绿茶'){
                            alert('4.5元');
                        }else{

                            alert('没有对应的饮料');
                        }
                  
                    }
           prize(wp);

2.定义一个函数,从wp接收第一个数,接收一个运算符号(+ - * / %),接收第二个数,利用这个函数作运算,并返回结果;

3.定义一个函数,从wp接收一个n,算出n的阶乘,不能用for;

4.定义一个函数,从wp接收一个n,算出斐波那契数列的第N位,不能用for循环;

新知识

(1)typeof机制

typeof检测数据类型的方式,是根据二进制码的后三位判断

数据类型二进制码后三位
数值型(number)001
字符串(string)100
布尔型(boolean)110
数组(Array)1000100010001000
null0000000000000000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值