JS之函数详解

1、定义

函数也是一个对象;它是可以重复执行的代码块;是可以完成特定功能的一段代码;使用typeof检查一个函数对象时,会返回function。

2、作用

因为一部分代码使用次数可能会很多,所以封装起来,需要的时候调用就可以了。这样做可以将复杂的事情简单化 ,将重复使用的代码进行统一封装。

特点: 封装到函数中的代码不会立即执行;函数中的代码会在函数调用的时候执行 ;调用函数语法:函数对象() ;调用函数时,函数中封装的代码会按照顺序执行。

3、基本使用

不常用:var fun = new Function("num");

常用函数定义:
function 函数名([形参1,形参2, ...,形参N]){
    函数体
}

函数调用:函数名();
 

4、常见的声明方式

  • 函数声明方式
function add(num1,num2){
      return num1+num2;
  }
  • 函数表达式声明方式
 var add= function(num1,num2){
        return num1+num2;
  }; 
  • 使用Function构造函数
var add = new Function('num1','num2','return num1+num2');

不推荐使用,  主要用于面向对象时理解"函数就是对象,  函数名就是指针"这一概念。

 5、函数的参数

设置参数是为了增强函数的功能性和函数的可拓展性,便于交互。

形参:形式上参与运算的变量,无实际值,为实参占位置,就像一个躯壳一样。
function f(a,b){}  //a,b是形参,占位用,函数定义时形参无值

实参:实际参与运算的变量。形参为他占位置,真实参与运算的变量。

f(x, y); //x, y实参,有具体的值,会把x,  y复制一份给函数内部的a和b,函数内部的值是复制的新值,无法修改外部的x,y。

注意:在其它语言中实参个数必须和形参个数一致,但是JavaScript中没有函数签名的概念,实参个数和形参个数可以不相等。

6、JS的运行机制问题

  • 在js中js引擎会优先解析var变量和function定义!在预解析完成后从上到下逐步进行!
  • 解析var变量时,会把值存储在“执行环境”中,而不会去赋值,值是存储作用!例如:alert(a);  var a = 5;  这时会输出undifiend,意思是没有被初始化没有被赋值!这并不是没有被定义,错误了的意思!
  • 在解析function时会把函数整体定义,这也就解释了为什么在function定义函数时为什么可以先调用后声明了!其实表面上看是先调用了,其实在内部机制中第一步实行的是把以function方式定义的函数先声明了! 

7、arguments对象

JS中函数有一个内置的对象arguments对象,其作用是:

  • 在js中函数定义没有任何参数,调用该函数时可以传递任意参数。
  • arguments对象是数组对象。
  • arguments对象的length属性:获取函数的实参个数。
  • 利用arguments对象特性,实现模拟函数的重载的效果。

arguments对象还有一个名叫callee的属性, 该属性是一个指针,  指向拥有这个arguments对象的函数。

8、回调函数

  • 回调函数就是一个通过函数调用的函数。
  • 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
  • 一般用于递归 。
求Fibonacci的第n个数
    1 1 2 3 5 8 13 21...
        function f1 (n) {
              if (n == 1) return 1;
              if (n == 2) return 1;

              return f1(n-1) + f1(n-2);
          }

          console.log(f1(5));

求n个数的累加

        function getSum (n) {
            if (n == 1) { return 1;}
            return n + getSum(n - 1);
        }

        console.log(getSum(50));

猜你喜欢

转载自blog.csdn.net/MySunshine07/article/details/84313405