JavaScript函数

2020-12-01  本文已影响0人  amanohina

函数的概念

函数声明

function 函数名(参数){
      封装的结构体;
}

函数声明的时候,不会执行,调用的时候才会执行

函数调用

函数的参数1

函数的参数2

函数的参数的优点

函数的返回值

函数的返回值的应用

函数表达式

函数的数据类型

arguments 对象

function fun(){
    console.log(arguments);
}
fun(1,2,3,4,5,6,7);

如上述代码,可以判断用户到底输入了几个实参,也可以查出实参长度,也可以使用遍历方法获取每一个实参

      // 使用数组的遍历方法可以获取每一项实参
      for (var i = 0 ; i <= arguments.length - 1 ; i++) {
        console.log(arguments[i]);
      }
    }
    // 调用函数
    fun(1,2,3,4,5,6,7);

案例: 定义一个求和函数,如果传入 1 个参数,返回它自己,如果传入两个参数,返回他们的和,如果传入三个参数,先比较前两个的大小,大的与第三个参数求和返回,如果传入 4 个及以上,输出错误提示。

 function sum(a,b,c) {
      // 条件分支语句,根据实参个数走不同的分支
      switch (arguments.length) {
        case 1:
          return a;
          break;
        case 2:
          return a + b;
          break;
        case 3:
          return a > b ? a + c : b + c ;
          break;
        default:
          // 提示用户,实参个数传递错误
          // 模拟控制台报错
          throw new Error("参数个数不能超过 3 个");
      }
    }
    // 调用函数
    console.log(sum(1));
    console.log(sum(1,2));
    console.log(sum(1,2,3));
    console.log(sum(1,2,3,4,5));

函数递归

var a = prompt("输入您想到的数字");
   function feibo(a){
     if(a==1 || a==2){
       return 1;
     }else {
       return feibo(a-1) + feibo(a-2);
     }
   }
   console.log(feibo(a));

作用域

全局变量和局部变量

函数的参数也是局部变量

函数的参数本质是一个变量,有自己的作用域,函数的参数也是属于函数自己内部的局部变量,只能在函数内部被使用,在函数外面没有定义

函数自己的作用域

如果定义函数是定义在另一函数的内容,那么调用的时候也应该在其内部进行调用

function outer() {
      var a = 1;
      function inner() {
        console.log(2);
      }
      // 函数内部调用子函数才能成功
      inner();
    }
    // 调用函数
    outer();
    // inner();

作用域链

 // 全局作用域
    var a = 1;
    // 创建函数
    function outer() {
      var a = 2;
      // 内部函数
      function inner() {
        var a = 3;
        console.log(a);
      }
      inner();
      console.log(a);
    }
    // 调用
    outer();
    console.log(a);

第一个console.log(a)是处于inner的作用域内,所以根据逻辑应该打印的数据为3,相应的,outer的作用域内为2,全局变量外打印应该为1


遮蔽效应

程序在遇到一个变量时,使用时作用域查找顺序,不同层次的函数内都有可能定义相同名字的变量,一个变量在使用时,会优先从自己所在层作用域查找变量,如果当前层没有变量定义会按照顺序从本层往外依次查找,直到找到第一个变量定义。整个过程中会发生内层变量遮蔽外层变量的效果,叫做“遮蔽效应”。


如果把inner函数内部的变量a声明注释掉
效果,找不到变量a就往外查询,以此类推

不写 var 关键字的影响

// 全局作用域
    // 没有定义全局变量但是outer函数内部没有声明var的定义了一个a变量也就相当于定义了全局变量a
    // var a;
    // 创建函数
    function outer() {
      a = 2;
      // 内部函数
      function inner() {
        var a = 3;
        console.log(a);
      }
      inner();
      console.log(a);
    }
    // 调用
    outer();
    console.log(a);

预解析与声明提升

变量声明提升

函数声明提升

   fun();
    // 定义函数
    function fun() {
      console.log(2);
    }
    // 调用
    fun();
//两次调用都可以实现

提升顺序

函数表达式的提升

函数声明提升的应用

IIFE自调用函数

   // 关键字定义的方式,不能立即执行
    function fun() {
      console.log(1);
    }();

    // 函数表达式方式,可以在定义时被立即执行
    var foo = function fun() {
      console.log(2);
    }();

如果想实现 IIFE,可以想办法将函数矮化成表达式。

 (function (a) {
      console.log(a);
    })(4);
上一篇 下一篇

猜你喜欢

热点阅读