自定义函数、数组的基础

308 阅读6分钟

自定义函数Function

什么是函数:

  • 需要先定义好,以后可以反复使用的一个代码段

何时使用:

  • 不希望打开页面立刻执行,以后可以反复使用,希望用户来触发...

如何使用:

创建:2种

  • 【声明方式】创建函数

    function 函数名(形参列表){
            操作;
            return 返回值/结果;
    }
    
  • 【直接量方式】创建函数:- 不推荐

     ```js
     var 函数名=function(形参列表){
             操作;
             return 返回值/结果;
     }
     ```
      - 感觉到函数名其实就是一个变量名
    

调用:

  • var 接住返回的结果=函数名(实参列表);
  • return
    • 其实return的本意是退出函数,但是如果return后面跟着一个数据
    • 顺便将数据返回到函数作用域的外部,但是return只负责返回,不负责保存,所以调用函数时要自己拿个变量来接住他
    • 就算省略return,默认也有,会return一个undefined
    • 具体需不需要得到函数的结果,看你自己:如果有一天你在全局希望拿着函数的结果去做别的操作,那么记得加return
    • 前辈们提供给你的方法,大部分基本上都加了return

作用域:2种

  • 全局作用域:全局变量 和 全局函数,在页面的任何一个位置都可以使用。
  • 函数作用域:局部变量 和 局部函数,在【当前函数调用时,内部可用】
    • 带来了变量的使用规则:优先使用局部的,局部没有找全局要,全局也没有那就会报错
  • 特殊点:缺点:
    • 1、千万不要在函数中对着未声明的变量直接赋值 - 全局污染:全局本身没有这个东西,但是被函数作用域给添加上了
    • 2、局部可以使用全局的,但是全局不能使用局部的 - 解决:看上面return

声明提前:

  • 规则:在程序正式执行之前,将var声明的变量(轻)和function声明的函数(重),都会悄悄的集中定义在当前作用域的顶部,但是赋值留在原地
  • 强调:
    • 声明方式创建的函数会完整的提前(第一种)
    • 直接量方式创建的函数不会完整提前,只有变量名部分会提前(第二种)

何时使用:

  • 永远不会自己使用,干扰我们判断的 - 只会在笔试中遇到,为什么平时开发不会遇到呢?
  • 只要你遵守以下规则:
    • 1、变量名和函数名尽量不要重复
    • 2、先创建后使用

重载:

  • 重载:相同的函数名,根据传入的实参的不同,自动选择对应的函数去执行,但是JS不支持,函数名如果重复了,后面的肯定会覆盖掉前面的
  • 解决:在【函数内部】自带一个arguments的对象(类似数组对象):不需要我们去创建 - 哪怕没有写任何形参,他也可以接受住所有实参,所以默认你看他length长度为0
    • 固定套路:
    • 1、通过下标去获取传入的某一个实参:arguments[i] - i从0开始
    • 2、通过length去获取到底传入了几个实参:arguments.length
    • 通过判断传入的实参的不同,在内部去写判断,从而变相的实现重载 ```

数组的基础:

 问题:保存1000个同学的名字?
 var name1="xx1";
 ...
 var name1000="xx1000";
    
    不推荐,变量其实就是我们所谓的内存,变量创建的越多,那么我们的内存空间消耗越大,那么网站性能就会越差
  • 解决:数组:创建一个变量可以保存【多个数据】
    • 数组都是线性排列,除了第一个元素,每个元素都有唯一的前驱元素
    • 除了最后一个元素,每个元素都有唯一的后继元素
    • 每个元素都有一个自己的位置,称之为叫做下标,下标都是从0开始的,到最大长度-1结束

创建数组:2种

直接量方式:

```js
var arr=[];//空数组
var arr=[数据1,...];
```

构造函数方式:

直接量:var arr=new Array();//空数组
构造函数:var arr=new Array(数据1,...);
  • 第二个方法有一个坑:new Array(num);//这句话的意思是:创建了一个长度为num的空数组,里面没有任何东西,只有无数的undefined
  • 如何释放一个引用类型:建议:我们的代码都要封装为一个函数,函数中的一切变量都会自动释放。

获取数组之中的元素:

  • 数组名[i]

后续添加/替换元素:

  • 数组名[i]=新数据;

  • 如果下标处没人则为添加,如果下标处有人则为替换

  • 数组具有三大不限制

    • 不限制元素的类型
    • 不限制元素的长度
    • 不限制下标越界 - 不是一个好东西
      • 如果获取元素时,下标越界,返回的是一个undefined
      • 如果添加元素时,下标越界,会得到一个稀疏数组,如果我们搭配上我们学过循环去遍历获取每个元素,那么你会得到很多很多undefined
    问题:自己数下标,难免会数错,导致我们下标越界
    
  • 解决:数组中有一个唯一的属性:length

    • 语法:数组名.length
    • 作用:获取到数组的长度,长度是从1开始的
    • 三个固定套路:
      • 1、向末尾添加元素:arr[arr.length]=新数据;
      • 2、获取数组的倒数第n个元素:arr[arr.length-n];
      • 3、缩容:删除倒数n个元素:arr.length-=n;
  • 遍历数组:往往很多情况,我们不会拿出某个元素来使用,而是拿出每个元素来进行 相同 或 相似的操作 - 搭配上循环

    • 固定公式:
      for(var i=0;i<arr.length;i++){
              arr[i];//当前次元素
      }
      

数组的传递问题

  • var a=x; var b=a; 修改a,b变不变,或者 修改b,a变不变?
    • 传递的如果是原始类型:其实是复制了一个副本给对方,两者互不影响
    • 传递的如果是引用类型:js中不是原始类型,就是引用类型(函数、数组,都是引用类型)- 浅拷贝
    • 因为引用类型很大,比原始类型大得多,不可能保存在变量本地,只是保存了一个地址值而已,其实是赋值了自己的地址值给对方,两者用的是同一个地址值,一个修改另一个也会变化