JavaScript 基础 (三)

2022.03.17

函数

函数是一段被封装的可重复执行调用的代码段

  • 声明函数

    function 函数名() {
      函数体;
    }
    
  • 调用函数

    函数名();
    

函数的参数

  • 形参:函数声明的小括号内是形参。形参可以看作是不用声明的变量
  • 实参:函数调用的小括号内是实参
  • 函数的参数可有可无,个数不限,之间用逗号隔开

函数的返回值

在函数内部,将函数的结果返回给调用者:

return 返回结果;
  • return语句会终止函数,其后面的代码不会被执行

  • return语句只能返回一个值。若写了多个值,则只返回最后一个值

  • 可以通过返回数组的方式来实现返回多个值

    return [array1, array2, array3, ......];
    
  • 函数若没有return,则返回的结果是undefined

arguments的使用

arguments是所有函数的一个内置对象,存储了传递的所有实参。

arguments的展示形式是一种伪数组,可以进行遍历:

  • 具有length属性
  • 按照索引的方式存储
  • 但没有真正数组的一些方法

函数可以调用另一个函数

function fun1() {
  fun2();
  函数体;
}
function fun2() {
  函数体;
}

函数的两种声明方式

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

  2. 利用函数表达式(匿名函数)

    // 声明函数,fun为变量名
    var fun = function() {
      函数体;
    }
    
    // 调用函数,fun为变量名
    fun();
    
    • 声明的函数没有名字,函数被赋值给的是一个变量
    • 调用时用变量名()调用
    • 也可以进行传参

作用域

js的作用域是指代码名字(如变量名)在某个范围内起作用和效果。目的是提高程序的可靠性,以及减少命名冲突。

在es6之前,js的作用域分为全局作用域和局部作用域。

  • 全局作用域:作用于整个script标签或整个js文件
  • 局部作用域:作用于函数内部

变量的作用域

  • 全局变量:
    • 在全局作用域下的变量
    • 在函数内部未定义直接赋值的变量也属于全局变量
  • 局部变量
    • 在局部作用域下的变量
    • 函数的形参也可看作是局部变量
  • 全局变量只有在浏览器关闭的时候才会销毁释放内存,局部变量在程序执行完毕后就会销毁,更节约内存

作用域链

用链式查找(就近原则)决定哪些数据能被内部函数访问,称为作用域链

预解析

  • js引擎运行js代码分为两步:预解析、代码执行
  • 预解析:会把js里面所有的var和function提升到当前作用域的最前面
  • 代码执行:会按照顺序从上往下执行

预解析分为:

  1. 变量预解析(变量提升):把所有的变量声明提升到当前作用域的最前面,但不提升赋值操作
  2. 函数预解析(函数提升):把所有的函数声明提升到当前作用域的最前面,但不调用函数