首页 > 编程语言 >JavaScript详解 ——函数

JavaScript详解 ——函数

时间:2025-01-14 21:03:22浏览次数:3  
标签:function console 函数 形参 JavaScript 详解 实参 log

1、函数的概念

在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码需要大量重复使用

函数:就是封装一段重复调用执行的代码块。通过代码块可以实现在需要的的重复使用,使用typeof检查一个函数对象时,会返回function

函数的封装是把一个或者多个功能通过函数的方式封装起来对外提供一个简单的函数接口,简单理解:将很多衣服打包到一个行李箱,jQuery就是一个函数封装库,对外暴露一个顶级对象$

2、函数的使用

函数在使用时分为两步:声明函数和调用函数

(1)、声明函数(创建函数)三种方式

第一种方式 创建一个构造函数对象

——我们在实际开发中很少使用构造函数来创建一个函数对象

——可以将要封装的代码以字符串的形式传递给构造函数

—— 封装到函数中的代码不会立即执行,函数中的代码会在函数调用的时候执行

构造函数是一个函数,当使用new关键字调用时,它用于创建对象并初始化对象的属性和方法

<script>

      var fun = new Function("console.log('hello 这是我的第一个函数')");

      console.log(typeof fun);//function

      fun();

    </script>

第二种方式 使用函数声明来创建一个函数(常用)

function 函数名([形参1,形参2,形参3,形参4....形参n]){

执行语句.....

}

<script>

     function fun2() {

        console.log("这是我的第二个函数~~~");

        alert("hahahaha");

        document.write("wuwuwuwu");

      }

    </script>

第三种方式 使用函数表达式来创建一个函数(匿名函数)

var 变量名=function([形参1,形参2,形参3,形参4....形参n]){

语句.....

}

注意:变量名不是函数名

<script>

    var fun3 = function () {

    console.log("我是匿名函数中的封装的代码");

  }; //相当于赋值语句

  fun3(); //调用函数

 </script>

注意:

由于函数一般是为了实现某个功能才定义的,所以通常我们将函数名命名为动词,例如getsum

(2)、调用函数

调用函数语法:变量名/函数名()

当调用函数时,函数中封装的代码会按照顺序执行

课堂小练习:1、利用函数计算1-100之间的累加和

3、函数的参数

(1)、参数

声明函数时,可以在函数名称后面的小括号里添加一些参数,这些参数是形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称谓实参

形参:形式上的参数,函数定义的时候,传递的参数,当前并不知道是什么,用来接收实参的,形参类似一个变量,声明了并未赋值,多个形参之间用逗号隔开

实参:实际上的参数,函数调用的时候传递的参数,实参是传递给形参,相当于给形参赋值

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

语法结构:

function 函数名(形参1,形参2····形参n){ //声明函数的小括号里的是形参(形式上的参数)

执行语句.....

}

函数名(实参1,实参2····)//在函数调用的小括号里面是实参(实际参数)

课堂小练习:1、利用函数求任意两个数的和

(2)、形参和实参匹配的问题

如果形参和实参的个数一致,则正常输出结果

如果参的个数参的个数,会取形参的个数

如果参的个数参的个数,多余的形参默认定义为undefined

调用函数时,解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,函数的实参可以是任意的数据类型

建议形参和实参个数一致

(3)、实参可以是任何类型

——可以是一个对象,当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传递

——实参可以是一个对象,也可以是一个函数

<script>

      //将参数封装到对象中传递

      function sayhello(o) {

        //console.log("o="+o);//对象

        console.log("我是" + o.name + ",今年" + o.age + "岁了," +

        "我是一个" + o.gender + "人" + ",我住在" + o.address);

      }

       //创建一个对象

      var obj = new Object();

      obj.name = "孙悟空";

      obj.age = 18;

      obj.gender = "男";

      obj.address = "花果山";

      sayhello(obj); //可以直接全部赋值

    //实参可以是一个函数

      function fun(a) {

        //console.log("a="+a);

        a(obj);

      }

      fun(sayhello);

      /*

      sayhello()

         -调用函数

         -相当于使用的函数的返回值

         -机器作出的东西

         

      sayhello

         -函数对象

         -相当于直接使用函数对象

         -机器

      */

    </script>

1、函数的返回值return

(1)、返回值语法结构:

function 函数名(){

return 需要返回的结果

}

函数名()

//需求:输入一个数,求1-这个数的和,在这个基础上进行+1,-1,*1,/1

var num = +prompt('输入一个数');

function getSum(num) {

  var sum = 0;

  for (var i = 1; i <= num; i++) {

    sum += i

  }

  console.log(sum)

  return sum;

}

var res= getSum(num)

console.log(res+1)

(2)、返回值注意事项:

函数只是实现某种功能,最终的结果需要返回给函数的调用者(谁调用函数,函数实现结果功能反馈给谁),函数名()=return 后面的结果,通过return实现的;可以定义一个变量,让return来接受该结果

在函数中,return之后的语句就都不会执行,有终止函数的作用

return只能返回一个值,多个值,返回的是最后一个值。如果有需求返回多个值,可以将多个值放入数组或者对象里

return后可以跟任意类型的值

如果return后不跟任何值,就相当于返回一个undefined

如果函数中不写return,则也会返回undefined

<script>

       // 需求:创建一个函数,用来计算三个数的和

       function sum(a, b, c) {

        var d = a + b + c;

        //console.log(d);

        //alert(d);

        return d;

      }

      //调用函数,变量result的值就是函数的执行结果

      var result = sum(4, 7, 8);

      //函数返回什么,result的值就是什么

      console.log("result=" + result);

    </script>

(3)、返回值类型

返回值可以是任意的数据类型,也可以是一个对象,函数

<script>

        //1:返回值对象

        function fun2() {

            //return 10;

            var obj = { name: "沙和尚" }

            return obj;//return {name:"沙和尚"}        

        }

        var a = fun2();

        console.log("a=" + a);

        //2:返回值是函数

        function fun3() {

            //在函数内部还可以声明一个函数

            function fun4() {

                alert("我是fun4");

            }

            //将fun4函数作为返回值返回

            return fun4;

        }

         a = fun3();//将箱子里的冰淇机器赋值,也就是fun4

         a=fun3;//与上面的区别,整个fun3函数赋值

        console.log(a);

    </script>

(4)、break、continue、return的区别:

break、continue、return的区别:

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

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

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

<script>

        function fun() {

            alert("函数要执行了~~~");

            for (var i = 0; i < 5; i++) {

                if (i == 2) {

                    break;//退出当前的循环

                    continue;//用于跳过当次循环

                    return;//使用return可以结束整个函数

                }

                console.log(i);

            }

            alert("函数执行完了~~~");

        }

        //fun();

    </script>

课堂小练习:1、利用函数求任意两个数的最大值

2、arguments的使用

在调用函数时,浏览器每次都会传递两个隐含的参数:

1:函数的上下文对象 this

2:封装实参的对象 arguments

当我们不确定有多少个参数传递的时候,可以使用arguments来获取,在JS中,arguments实际上它是当前函数的一个内置对象。所有函都内置了一个arguments对象,arguments对象中存储了传递的所有实参。

(1)、arguments 是一个伪类数组对象,它也可以通过索引来操作数据,通过arguments.length可以获取实参的长度获取长度

伪数组并不是真正意义上的数组

具有数组的length属性

按照索引的顺序进行存储的

它没有真正数组的一些方法

(2)、在调用函数时,我们所传递的实参都会在arguments中保存

(3)、我们即使不定义形参,也可以通过grguments来使用实参,只不过比较麻烦

arguments[0]表示第一个实参

arguments[1]表示第二个实参

(4)、arguments有个属性叫callee

这个属性对应一个函数对象,就是当前正在指向函数的对象

<script>

        function fun() {

        //这两种都是检查arguments是不是数组

        //console.log(arguments instanceof Array);//false

        //console.log(Array.isArray(arguments));//false

        //console.log(arguments.length);//用来获取实参的长度

        //console.log(arguments[0]);//hello

        console.log(arguments.callee);//指向当前这个对象

      }

      fun("hello", true);

    </script>

课堂小练习:1、利用函数求任意个数的最大值

function getMax() {

  var max = arguments[0]

  for (var i = 0; i < arguments.length; i++) {

    if (max < arguments[i]) {

      max = arguments[i]

    }

    return max

  }

}

var num = getMax(1, 2, 3, 33, 111)

2、封装函数,输入一个年份,判断是否是闰年(闰年可以被4或者400整除)

面试题:

1.伪数组和真数组的区别是什么?

2.如何获取到伪数组?

3、函数方法call(),apply() ,bind()

-这两个方法都是函数对象的方法,需要通过函数对象来调用

-当对函数调用call()和apply()方法时,都会调用函数执行

-在调用call和apply()可以将一个对象指定为第一个参数此时这个对象将会成为函数执行的this

-call()方法可以将实参在对象之后一次传递

apply()方法需要将实参封装到一个数组中统一传递

<script>

      var name = "我是window";

        function fun(a) {

          console.log("a=", a);

          alert(this.name);

        }

        var obj = {

          name: "我是obj1",

          sayName: function () {

            alert(this.name);

          },

        };

        var obj2 = {

          name: "我是obj2",

        };

      //obj.sayName(); //obj

      //obj.sayName.call(obj2);//obj2

      //fun.call(obj, 2);//obj1,2

      //fun.apply(obj2, [2,3]);

      //fun(1);

    </script>

总结this的情况

1.以函数形式调用时,this永远是window

2.以方法的形式调用时,this是调用方法的对象

3.以构造函数的形式调用时,this是新创建的那个实例对象

4.使用call和apply调用时,this是指定的那个对象,如果不写第一个参数,默认是window

4、函数调用函数

每个函数都是独立的代码块,用于完成特殊任务,因此经常会用到函数相互调用的情况

一般情况下,一个函数只做一件事

<script>

        function fn1(){

            console.log(111);

            fn2();

            console.log('fn1');

        }

        function fn2(){

            console.log(222);

            console.log('fn2');

        }

        fn1()

    </script>

课堂小练习:用户输入年份,告知当年2月份多少天

<script>

      function getDays() {

        var year = prompt("请输入年份");

        if (isRunYear(year)) {

          alert("闰年2月有29天");

        } else {

          alert("平年2月有28天");

        }

      }

      getDays();

      

      function isRunYear(year) {

        var flag = false;

        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {

          flag = true;

        }

        return flag;

      }

    </script>

5、立即执行函数

语法结构:函数对象()

立即执行函数,函数定义完后,立即被调用,立即调用函数,往往只会执行一次

<script>

          //第一种写法

        (function(){

                alert("我是一个匿名函数~~~");

            }) ();//外面的()是把整个函数当作函数名,后面的()是调用函数的意思

      //第二种写法

          (function () {

            alert('匿名函数执行方式二')

          }() );

      //匿名函数传参

          (function(a,b){

                console.log("a="+a);

                console.log("b="+b);

            })(123,456);//不仅可以调用,还可以传值

    </script>

标签:function,console,函数,形参,JavaScript,详解,实参,log
From: https://blog.csdn.net/2301_76428778/article/details/145147250

相关文章

  • Python 文件和异常捕获(详解)
            前言:在Python编码中,我们会学到python中的文件的读取与写入,当然还有对文件夹的操作,在文章的最后还有异常捕获的详细解释~~一.文件的概念:        有名称:每个文件都有一个文件名,用于在特定的文件系统中唯一标识该文件,方便用户和系统对文件进行识别、访......
  • MySQL基础函数使用
    DQL中的函数#官方函数链接https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format4.1 单行函数函数都是数据库提前给我们准备好的,所以我们可以直接调用,使用函数可以让指定的列计算出我们需要的数据单行函数:指的是操作一行数据返......
  • Qt/C++ 基于回调模式的海康3D相机开发流程详解(附工程源码、开发文档下载链接)
    本文将基于海康3D相机SDK的回调模式,通过具体代码讲解如何完成从设备初始化到图像采集的完整流程。以下是标准的流程图和具体的开发步骤。一、开发流程概述流程分为以下几个关键步骤:运行环境初始化:调用MV3D_LP_Initialize(),初始化SDK运行环境。设备发现:调用MV3D_LP_Get......
  • 深度剖析RabbitMQ:从基础组件到管理页面详解
    文章目录一、简介二、Overview2.1Overview->Totals2.2Overview->Nodesbroker的属性2.3Overview->Churnstatistics2.4Overview->Portsandcontexts2.5Overview->Exportdefinitions2.6Overview->Importdefinitions三、Connections连接的属性四、Channels通道的......
  • 7分钟玩转 AI 应用,函数计算一键部署 AI 生图大模型
    人工智能生成图像(AI生图)的领域中,StableDiffusionWebUI以其强大的算法和稳定的输出质量而闻名。它能够快速地从文本描述中生成高质量的图像,为用户提供了一个直观且高效的创作平台。而ComfyUI则以其用户友好的界面和高度定制化的选项所受到欢迎。ComfyUI的灵活性和直观性使得......
  • 【邮件钓鱼】技术干货:从伪造域名到隐藏链接,攻防实战详解(中)
    0x01前言★声明:未知攻焉知防,本文以安全教育为主,不可用于违法行为,造成的一切后果,与本人无关。邮件伪造是信息安全中的常见手段之一,很多人在实践中因不了解核心原理而踩坑。本篇将结合实践经验,系统讲解邮件伪造的原理与操作方法。如果对SPF和DKIM验证原理不熟悉,请先阅读上......
  • 【程序猿面试真题——计算机基础知识和编程】回调函数怎么实现?
    【程序猿面试真题——计算机基础知识和编程】回调函数怎么实现?【程序猿面试真题——计算机基础知识和编程】回调函数怎么实现?文章目录【程序猿面试真题——计算机基础知识和编程】回调函数怎么实现?什么是回调函数?回调函数的应用场景:回调函数的实现1.回调函数的基本结......
  • Oracle自定义函数:生成汉字首字母拼音码的函数、MD5
    1 生成汉字拼音码的函数使用方法:select用户名.函数名(需要获取首字母拼音码的字段名)from用户名.表名;selectoracle_user1.fgetpy(t.name)fromoracle_user1.studentt;函数定义:createorreplacefunctionfgetpy(v_strvarchar2)returnvarchar2asv_strleni......
  • 【C语言】_字符函数
    目录1.字符分类函数1.1相关函数及其功能1.2使用示例2.字符转换函数2.1相关函数及其功能2.2使用示例1.字符分类函数1.1相关函数及其功能函数其参数符合下列条件则返回真iscntrl任何控制字符isspace空白字符:空格'';换页'\f';换行:'\n';回车:'\r';制表符:'\t';垂直制......
  • 【AI+框架】2025智能计算中心技术框架详解
    智算中心是对外提供AI算力服务的公共基础设施,如何构建一个高性能、可扩展的技术架构,是智算中心非常重要的技术支撑,所以要在智算中心完成算力的生产、聚合、调度和释放,从而实现构建平台,提供服务。智算中心的总体架构如下图所示:【图1】智能计算中心总体架构图1.整个架构可以......