js函数

作者: moly琴 | 来源:发表于2018-11-02 11:36 被阅读0次

    函数

    定义

    函数主要用于对具体某些功能或方法的代码块进行打包或封装

    特点

    • 函数不会主动调用,使用时需要手动调用
    • 函数可以被多次调用
    • 每个函数就是一个短小的脚本

    作用

    • 减少代码冗余

    • 方便后期的开发及维护

    • 函数可以被多次调用

    • 函数真正的威力体现在,允许将不同的数据传递给函数

    在js中共两种函数

    1. 自定义函数
      在这主要讨论自定义函数。

    2. 系统函数(内置函数)

    • js中已经定义好的函数,使用时,不需要定义,直接使用即可
    • 强制转换数据类型的String(),Number(),Boolean()paresInt(),parseFloat()
    • isNaN()判定 值,如果不是数字返回true,如果是数字返回false;主要用于判定程序中的某些值是否是合法值
    • eval()表示把字符串转换为表达式,一般不使用此方法。
    自定义一个函数

    就是如何封装一个功能或方法,可以分为三个步骤

    • 确认函数的名称
    • 确认参数个数
    • 确认是否需要有返回值(return

    下面是具体的方法与细节理解

    1.定义函数

    定义函数有两种方式

    1.1 函数的声明式

    通过关键字function

    function  函数名(){
        //功能代码
    }
    

    函数命名规则

    • 使用字母(大小写),数字,$,但是数字不能开头,且不能包含空格。
    • 在命名变量名时使用下划线来分隔各个单词,为了一眼看出是函数名还是变量名,函数名使用小驼峰命名。
    • 不能使用中文,尽量使用相关功能的英文名称
    • 函数名有多个单词组成,使用驼峰命名法

    1.2 函数的表达式

    • 函数是一种引用数据类型,只要是数据就可以赋值给变量,此时的变量就是函数名,通过函数名()即可调用该函数。
    var 变量名 = function(){
    //功能代码
    };
    

    function( ){ 代码块 }
    表示匿名函数,没有函数名称的函数,此时的变量名就是函数名。

    2.调用函数

    函数定义好后,函数不会自己执行,必须手动调用。使用如下语句调用

    函数名( );
    

    其中( )表示执行指定函数

    注意

    写一个函数的过程一般是先进行需求分析,再确定函数名,再进行函数的功能或方法的代码书写,以及封装,最后写完不要忘了调用,不调用,函数是不会自动执行的。简单来说,就是函数的定义和调用两个步骤。

    针对两种定义函数都可以用,但是也有一些区别值得注意

    3.两种定义函数的区别知识点

    • 对第二种表达式定义函数的理解。函数是一种引用数据类型(与基础数据类型对应的常见引用数据类型有对象,函数,数组),只要是数据就可以赋值给变量,此时的变量就是函数名。

    • 两种定义方式在调用与定义顺序的区别。使用申明式定义的函数,调用可以放在函数的前面或者后面,前后效果一样。但是函数的表达式,只能在定义函数的后面调用。因为赋值给了变量,变量的使用就是先申明再使用。

    在声明式定义的函数的脚本里,可以从任意位置去调用这个函数。

    • 两种方式定义的函数的共同点。都可以多次调用,调用一次执行一次。

    4.参数(argument)

    在上面提到函数真正的威力体现在,允许将不同的数据传递给函数。我们可以把传递给函数的数据称为参数(argument)。函数的参数分为形参和实参。

    4.1 形参

    形式参数,即形参。函数在执行过程中需要进行数据的计算,但是该数据不是具体的某个值,使用形参代替。类似数学表达式的的自变量,需要给自变量给定某个值才有结果,但是需要这个变量在这占位置。有了这个位置才能接受给定的值进行计算。

    形式参数相当于函数体中的定义的变量,只是一个占位符。相当于在函数体内var 形参 ;但是未赋值一样。

    在定义函数的时候,可以为它声明任意多个参数,只要用逗号将它们分隔开就行。在函数体内部可以像使用普通变量那样使用它的任何一个参数。

    function 函数名字(形式参数1,形式参数2,....){
         功能代码…
    }
    
    var 变量名 = function(形式参数1,形式参数2){
         功能代码…
    }
    
    4.2 实参
    函数名(实参1,实参2,....);
    

    实际传入的参数与形式参数必需一一对应,但是在js中,形参的个数和实参的个数可以不相等,也不会报错,如果,实参多了,那么忽略多的,前面的一一对应。如果形参多了,那么,多的就是未定义,就是申明了变量但是未赋值的时候的未定义。

    5. 函数返回值

    函数不仅可以以参数的形式接收数据,还可以返回数据。

    创建了一个函数,想让函数返回一个数值、一个字符串、一个数组或一个布尔值。这个时候就要用到return语句。

    程序在执行中产生的数据可能会被其他程序使用,或者计算结果会参与其他的运算,这时候必须使用return作为返回相应的值,不然返回的是undefined。如果直接使用函数赋值给一个变量,变量与一个数字相加,返回的是NaN

    函数真正的价值体现在,可以把函数当做一种数据类型来使用,可以把一个函数的调用结果赋给一个变量

    返回值的语法结构

    申明式

    function 函数名( ){
      函数体;
      return 结果值;
    }
    
    • 如果程序中的计算结果需要在外部使用,必须使用return进行返回。
    • 如果程序的计算结果不需要参与外部的运算,可以使用三种输出方式输出即可。
    • 如果需要返回多个值,需要使用数组或对象的方式来保存数据。
      a. 数组 [a, b, c]
      b. 对象 [key:value; ]

    在递归函数中的应用

    斐波拉契数列

    <script>
        function f(n) {
            if (n == 0 || n == 1) {
                return 1;
            }else {
                return f(n-1)+f(n-2);
            }
        }
        document.write(f(2));
    </script>
    

    阶乘

    <script>
        function fact(n) {
            if (n == 0 || n == 1) {
                return n;
            } else {
                return fact(n-1)*n;
            }
        }
        document.write(fact(3));
    </script>
    

    前n项奇数和

    <script>
        function oddSum(n) {
            if (n == 1) {
                return 1;
            }else{
                return 2*n - 1 + oddSum(n-1) ;
            }
        }
        document.write(oddSum(10));
    </script>
    

    return表示返回值,且终止此次代码。

    6. 变量的作用域(scope)

    变量的作用范围
    函数体内定义的变量为局部变量
    函数体为未使用关键字的变量为隐式全局变量

    1. 确定变量的作用范围
    2. 根据变量声明的位置可以分为全局变量和局部变量

    6.1 全局变量

    主要声明在函数外部,供整个js代码使用。

    如果使用同一个名字的变量,可能会冲突。

    6.2 局部变量

    主要在函数内部通过var关键字声明的,仅供当前函数使用。

    局部变量的优先级高于全局变量。

    6.3 建议

    针对变量的作用域给的建议

    函数在行为方面应该像一个自给自足的脚本,在定义一个函数时,我们要把它内部变量全都明确的申明为局部变量。

    尽量不要在函数体内不使用关键字直接使用一个变量,虽然不会报错,如果变量名和外部的变量名一样,那么函数体的变量会提升变量为全局变量,会影响到外部的变量的值。

    如果总是在函数体里使用关键字来定义变量,就能避免任何形式的二义性隐患。

    6.4 用途

    当然了解了变量的作用域,可以用于以下

    • 主要用于团队开发时,避免变量名的冲突
    • 一般团队开发,先使用局部变量,后期合并代码时,再抽取公用变量。

    7. 递归

    上文提到了递归,递归用一句话说,即函数自身对自身的调用

    递归函数必须有1.递归点和2.递归出口
    递归点,表示什么时候开始调用自己(递进去)
    递归出口,表示什么时候不再调用自己(归回来)

    注意

    • 递归函数必须有出口,没有出口则为死循环。
    • 递归函数必须要有层次的变化

    用途

    • 主要用于后期大型项目中的树形结构的遍历如商品分类(无限极),文件目录查找,排序算法,QQ克隆好友操作。

    经典的递归例子,斐波拉契数列,基于斐波拉契数列的还有一个经典例子,跳台阶。

    所有的递归函数都可以用循环的语句写出来,但是递归有递归的优点,当然也有其缺点。

    递归的缺点,占很大的内存。

    相关文章

      网友评论

          本文标题:js函数

          本文链接:https://www.haomeiwen.com/subject/xlsqxqtx.html