1.函数

1.函数的概念

在js里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用,而用for循环具有局限性,因此我们就可以使用JS中的函数
函数:就是封装了一段可被重复调用执行的代码块,通过此代码块可以实现大量代码的重复使用(函数的目的)

2.函数的使用

函数的使用分为两步:声明函数和调用函数
声明函数 function 函数名(){
函数体;
}

  • 函数是做某些事情,函数名一般是动词
  • 函数不调用,自己不执行

调用函数: 函数名();

3.函数的封装

  • 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
  • 简单理解:封装类似于将电脑配件整合到机箱中(类似于快递打包)

    4.函数参数和返回值return

    1.函数形参和实参个数不匹配问题

    | 参数个数 | 说明 | | —- | —- | | 实参个数等于形参个数 | 输出正确结果 | | 实参个数多于形参个数 | 只取到形参的个数 | | 实参个数小于形参个数 | 多的形参定义为undefined,结果为NaN |

  • 声明函数时,函数名括号里面的是形参,形参的默认值是undefined

  • 调用函数时,函数括号里面的是实参

    2.函数的返回值return

  • return终止函数,后面的代码不会执行

  • return只能返回一个值,返回的结果是最后一个值
  • 如果函数没有return,就返回undefined
  • return不仅退出循环,返回一个数,还会终止代码

    5.arguments使用

    当我们不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。所以函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
    arguments展示形式是一个伪数组,因此可以进行遍历,伪数组具有以下特点:

  • 具有length属性

  • 按索引方式储存数据
  • 不具有数组的push,pop等方法
  • 只有函数才有arguments对象,而且是每个函数都内置好了这个arguments

    1. function fn(){
    2. console.log(arguments);//存储了传递的所有实参
    3. console.log(arguments.length);
    4. }
    5. fn(1,2,369);
    6. 输出结果:
    7. Arguments(3) [1, 2, 369, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    8. 0: 1
    9. 1: 2
    10. 2: 369
    11. length: 3
    12. callee: ƒ fn()
    13. Symbol(Symbol.iterator): ƒ values()
    14. __proto__: Object
    15. 3

    案例:利用函数求任意个数的最大值

    1. function getmax(){
    2. var num=arguments[0];
    3. for(var i=0;i<arguments.length;i++){
    4. if(arguments[i]>num){
    5. num=arguments[i];
    6. }
    7. }
    8. return num;
    9. }
    10. console.log(getmax(1,7,6));
    11. 输出结果:
    12. 7

    2021.09.08.20:44

    6.函数的声明方法

    1.利用函数关键字自定义函数(命名函数)
    function fn(){

    1. }<br /> fn();<br />2.函数表达式<br /> var 变量名=function(){};<br /> var fun=function () {<br /> document.write("函数表达式")<br /> };<br /> fun();<br />fun是变量名,不是函数名,这个函数没有名字,所以叫做匿名函数

    2.作用域

    1.作用域概述

    通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域
    作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突
    JavaScript作用域:就是代码名字在某个范围内起作用和效果

    2.全局变量和局部变量

  • 全局变量:在全局作用域下的变量,在全局下都可以使用

    注意:如果在函数内部,没有声明直接赋值的变量也属于全局变量

  • 局部变量:在局部作用域下的变量。后者在函数内部的变量就是局部变量

注意:函数的形参也可以看做是局部变量

  • 从执行效率来看(区别):

全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
局部变量当我们程序执行完毕,就会销毁,比较节约内存资源

现阶段JavaScript没有块级作用域,js也是在es6时新增的块级作用域
即()、{}等,在里面定义的变量可以拿到外边去使用
如:if(3<5){
var num=6;
}
document.write(num);
输出结果为:6

3.作用域链

作用域链:内部函数访问外部韩式的变量,采取的是链式查找的方式来决定那个值(就近原则)

4.预解析

JavaScript代码是由浏览器中的JavaScript解析器来执行的,JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行
js引擎运行js分为两步:预解析 代码执行

  • 预解析:js引擎会把js里面所有的var 还有function提升到当前作用域的最前面
  • 代码执行:按照代码书写的顺序从上往下执行

预解析分为变量预解析(变量提升)和函数预解析(函数提升)
变量提升:就是把所有的变量声明提升到当前作用域最前面,不提升赋值操作
函数提升:就是把所有的函数声明提升到当前作用域的最前面 不调用函数

  1. //1问
  2. //console.log(num);
  3. //2问,相当于先执行了 var num;
  4. console.log(num);
  5. var num=10;
  6. //3问
  7. //fn();
  8. function fn(){
  9. console.log(11);
  10. }
  11. //fn();
  12. //4问
  13. //fun();报错,相当于执行了 var fun; fun();变量没有赋值,所以不能被调用
  14. var fun1=function(){
  15. console.log(22);
  16. }
  17. fun1();//相当于先执行了var fun;
  18. var num=10;
  19. fun();
  20. function fun(){
  21. console.log(num);
  22. var num=20;
  23. }
  24. //相当于
  25. var num;
  26. function fun(){
  27. var num;
  28. console.log(num);
  29. num=20;
  30. }
  31. num=10;
  32. fun();
  33. f1();
  34. console.log(c);
  35. console.log(b);
  36. console.log(a);
  37. function f1(){
  38. var a = b = c =9;
  39. console.log(a);
  40. console.log(b);
  41. console.log(c);
  42. }
  43. //相当于
  44. function f1(){
  45. var a;//a有var声明,局部变量,b和c直接赋值,没有var声明,当全局变量看
  46. a = b = c =9;
  47. console.log(a);
  48. console.log(b);
  49. console.log(c);
  50. }
  51. f1();
  52. console.log(c);
  53. console.log(b);
  54. console.log(a);
  55. 输出结果:
  56. undefined
  57. 预解析.html:34 22
  58. 2预解析.html:48 undefined
  59. 预解析.html:68 9
  60. 预解析.html:69 9
  61. 预解析.html:70 9
  62. 预解析.html:55 9
  63. 预解析.html:56 9
  64. 预解析.html:57 Uncaught ReferenceError: a is not defined
  65. at 预解析.html:57

2021.9.13.17:25