JS基础加强三_函数

来源:互联网 发布:淘宝怎么装修首页 编辑:程序博客网 时间:2024/05/19 06:51

函数基础

1. 函数概念

1.1 什么是函数

函数就是可以重复执行的代码块

  • 为什么要用函数
    因为一部分代码使用次数可能胡很多次,所以封装起来,需要的时候调用就可以了

1.2 函数定义三种方法

关键字function, function 函数名( ) { 程序 }

//第一种function fn1(){console.log("我是第一种定义方法!");}//第二种(匿名函数)var fn2 = function (){console.log("我是第二种定义方法!");}//第三种var fn3 = new Function("console.log('我是第三种定义方法!')");

1.3 参数

  • 形参
    形式上参与运算的变量,无实际值,为实参占位置,就像一个躯壳一样.(可以理解为函数的内部变量外部无法访问)
  • 实参
    实际参与运算的变量,形参为他占位置,真实参与运算的变量.

1.4 返回值

有return函数就有值;没有return函数就没值;

函数程序运行后的结果外部需要使用的时候,我们不能直接给与,需要通过return 返回,
总结:函数内部,return 后面的值就是返回值
作用: 函数执行后剩下结果就是返回值
函数执行完毕, 会不会留下点什么,取决与有没有返回值
var temp = 函数名( ) = (功能)+ 该函数的返回值

1.5 返回值注意点

  • 如果函数没有显示的使用return 语句,那么函数有默认的返回值:undefined
  • 如果函数使用return语句,那么跟在return后面的值,就成了函数的返回值
  • 如果函数使用return语句,但是return后面没有任何值,那么函数的返回值也是:undefined
  • 函数使用return 语句,这个函数会在执行完return语句之后停止并立即退出,也就是说return后面的所有其他代码都不会在执行

2. 函数的运用

2.1 函数名、函数体、和函数加载问题

  • 函数名是什么
    函数名,就等于整个函数。
    执行函数,就等于函数的功能+返回值;
function fn(){alert(1)};console.log(fn) == console.log(function fn(){alert(1)});
  • 函数表达式
var myFun = function (a,b){        return a + b;    }    console.log(myFun(6,7));

2.2 变量和作用域(函数中的变量需要 函数执行后才能使用)

函数加载的时候,只加载函数名,不加载函数体

  • 全局变量(成员变量)
    哪里都可以访问到的变量,进入script立即定义的变量和没有var的变量
  • 局部变量
    函数内部的变量,只有函数内部可以访问到,函数内部用var定义的变量的形参
  • 全部变量和局部变量区别
    • ①. 定义的位置不同
      成员变量定义在类中
      局部变量定义在方法中以及语句里
    • ②. 在内存中的位置不同
      成员变量存储在堆内存的对象中
      局部变量存储在栈内存的方法中
    • ③. 生命周期不同
      成员变量随着对象的出现而出现看,随着对象的消失而消失
      局部变量随着方法的运行而出现,随着方法的弹栈而消失
    • ④. 初始化不同
      成员变量因为在堆内存中,所有默认初始化值
      局部变量没有默认初始化值,必须初始化后才可以使用

2.3 隐式全局变量

隐式全局变量就是隐藏的全局变量不好被发现。function  fn(){var  a  =  b  =  c  =  1;   // b和c就是隐式全局变量}注意:function  fn(){var  a  =  b  =  c  =  1;   // b和c就是隐式全局变量(等号)var  a = 1;  b = 2;  c = 3;     // b和c就是隐式全局变量(分号)var  a = 1 ,  b = 2 ,  c = 3;    // b和c就不是隐式全局变量(逗号)}

2.4 变量声明提升 (出现原因:预解析)

预解析:js的解析器在页面加载的时候,首先检查页面上的语法错误。把变量声明提升起来。
函数中,定义变量在使用变量之后。
值提升变量名,不提升变量值,容易出现undefined。计算后形成NaN。而用function直接定义的方法是整体提升。

function fn(){// var aaa;console.log(aaa);var aaa = 1;}

提前看一眼这个习惯叫什么呢? 预解析!
变量声明提升:在预解析的时候,成员变量和函数,被提升到最高位置,方便其他程序访问。
变量声明提升特点:成员变量只提升变量名,不提升变量值。但是,函数是所有内容全部提升。(function直接定义的)
函数范围内照样会出现变量声明提升
什么情况容易出现变量声明提升:使用变量在定义变量之前

3. 函数高级

3.1 函数小知识

  • 函数不调用不执行
  • 函数名就等于(整个函数)
  • 加载函数的时候,只加载函数名,不加载函数体
  • 参数相当于局部变量
  • 就近原则使用变量
  • 两个平级的函数中的变量不会相互影响(可以使用同样的形参名)

3.2 匿名函数

定义:匿名函数就是没有名字的函数。
作用:
1. 不需要定义函数名的时候。(群众演员没必要起名,百万雄师下江南)
2. 书写起来更简便。
匿名函数的调用有三种方法:

  • 直接调用或自调用。(function(){alert(1)})()
  • 事件绑定。
  • 定时器。

3.3 函数是一种类型

定义:函数也是一种数类型,但是,归根结底还属于object

3.4 递归

定义:递归是一种思想:类似于我们的计数器,开闭原则
递归的实质就是函数自己调用自己

递归注意点:递归必须有跳出条件,否则是死循环

案例讲解:用递归求1+100的和alert(getSum(100));function getSum(n){    //跳出条件    if(n<1){        return 0;    }    return n+getSum(n-1);}

3.5 回调函数

定义:函数作为参数进行传递和使用
执行函数就等于:函数名+(); 整个函数+();

fn (test);function fn(demo){    demo( );}function test(){    console.log("我是被测试的函数!");}

什么情况下,使用回调函数:

  • 回调函数一般是 用于定义一个规则来使用的,规则的传递只能通过函数实现,通过变量无法达成,所以我们需要传递规则的时候必须使用回调函数
0 0