js函数

2018-11-02  本文已影响0人  moly琴

函数

定义

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

特点

作用

在js中共两种函数

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

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

自定义一个函数

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

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

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 结果值;
}

在递归函数中的应用

斐波拉契数列

<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.递归出口
递归点,表示什么时候开始调用自己(递进去)
递归出口,表示什么时候不再调用自己(归回来)

注意

用途

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

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

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

上一篇下一篇

猜你喜欢

热点阅读