函数
函数是一段被封装的可重复执行调用的代码段
-
声明函数
function 函数名() { 函数体; }
-
调用函数
函数名();
函数的参数
- 形参:函数声明的小括号内是形参。形参可以看作是不用声明的变量
- 实参:函数调用的小括号内是实参
- 函数的参数可有可无,个数不限,之间用逗号隔开
函数的返回值
在函数内部,将函数的结果返回给调用者:
return 返回结果;
-
return语句会终止函数,其后面的代码不会被执行
-
return语句只能返回一个值。若写了多个值,则只返回最后一个值
-
可以通过返回数组的方式来实现返回多个值
return [array1, array2, array3, ......];
-
函数若没有return,则返回的结果是undefined
arguments的使用
arguments
是所有函数的一个内置对象,存储了传递的所有实参。
arguments的展示形式是一种伪数组,可以进行遍历:
- 具有
length
属性 - 按照索引的方式存储
- 但没有真正数组的一些方法
函数可以调用另一个函数
function fun1() {
fun2();
函数体;
}
function fun2() {
函数体;
}
函数的两种声明方式
-
利用函数关键字自定义函数(命名函数)
-
利用函数表达式(匿名函数)
// 声明函数,fun为变量名 var fun = function() { 函数体; } // 调用函数,fun为变量名 fun();
- 声明的函数没有名字,函数被赋值给的是一个变量
- 调用时用
变量名()
调用 - 也可以进行传参
作用域
js的作用域是指代码名字(如变量名)在某个范围内起作用和效果。目的是提高程序的可靠性,以及减少命名冲突。
在es6之前,js的作用域分为全局作用域和局部作用域。
- 全局作用域:作用于整个script标签或整个js文件
- 局部作用域:作用于函数内部
变量的作用域
- 全局变量:
- 在全局作用域下的变量
- 在函数内部未定义直接赋值的变量也属于全局变量
- 局部变量
- 在局部作用域下的变量
- 函数的形参也可看作是局部变量
- 全局变量只有在浏览器关闭的时候才会销毁释放内存,局部变量在程序执行完毕后就会销毁,更节约内存
作用域链
用链式查找(就近原则)决定哪些数据能被内部函数访问,称为作用域链
预解析
- js引擎运行js代码分为两步:预解析、代码执行
- 预解析:会把js里面所有的var和function提升到当前作用域的最前面
- 代码执行:会按照顺序从上往下执行
预解析分为:
- 变量预解析(变量提升):把所有的变量声明提升到当前作用域的最前面,但不提升赋值操作
- 函数预解析(函数提升):把所有的函数声明提升到当前作用域的最前面,但不调用函数