函数
函数就是封装了一段可被重复调用执行的代码块。通过此代码可以实现大量代码的重复操作
函数在使用时分为两步:声明函数和调用函数
声明函数
function 函数名(){
函数体;
}
调用函数
函数名()
调用函数的时候要注意加上小括号
函数的封装
就是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
简单理解就是:类似于将电脑配件整合组装到机箱中(类似于快递打包)
函数的参数
在声明函数括号中的参数为形参
在函数调用括号中的参数为实参
function 函数名(形参1,形参2…){
函数体;
}
函数名(实参);
如果实参的个数比形参多,只取到形参的个数
如果实参个数小于形参,多余的形参定义为undefined,结果是NaN
函数的返回值return
让函数把值返回给调用者(谁点菜,就把菜返回给谁)
格式:
function 函数名(){
return 需要返回的结果;
}
函数名();
- 只要函数遇到return,就把后面的结果返回给函数的调用者,就是把函数名()变成return 后面的结果,即令函数名() = return
- return还有终止函数的作用,遇到return,后面的语句就都不执行了
- return只能返回一个值,如果用逗号隔开多个值,以最后一个为准
- 如果没有return,则返回undefined
arguements的使用
当我们不确定有多少个参数传递的时候,可以用arguments来获取。
在JS中,arguments实际上是当前函数的一个内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递所有实参。
function fn(){
console.log(arguments);
}
fn(1,2,3);
结果是:arguments(3)[1,2,3]
arguments展示形式是一个伪数组,因此可以进行遍历。伪数组有以下特点:
- 具有length属性
- 按照索引方式存储数据
- 不具有数组的push,pop等方法
函数的两种声明方式
利用函数关键字 function 函数名()
利用函数表达式 var 变量名 = function(){} 如var fun = function(){}
- fun是变量名,不是函数名
- 函数表达式的声明方式跟声明变量差不多,只不过变量里面存的是值,而函数表达式里存的是函数
- 函数表达式也可以进行传递参数
作用域
一段程序代码中所用的名字(变量)并不是总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 全局作用域:整个script标签,或者是一个单独的js文件
- 局部作用域:在函数内部就是局部作用域,这个代码的名字只在函数内部其效果和作用
变量的作用域:
根据作用域的不同,把变量分为全局变量和局部变量
- 全局变量:在全局作用域下的变量(如果在函数内部,没有声明直接赋值的也叫全局变量)
- 局部变量:在局部作用域下的变量,后者在函数内部的变量就是局部变量
注意:全局变量只有浏览器关闭的时候才会销毁,比较占用内存资源;局部变量当程序执行完毕了就会销毁,比较节约资源
作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的局部作用域
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就成做作用域链
- 采取的就近原则
预解析
JS代码是有浏览器中的JS解析器来执行的。JS解析器在运行JS代码的时候分为两步:预解析和代码执行。
- 预解析:JS引擎会把JS里面所有的var还有function提升到当前作用域的最前面
- 代码执行:按照代码书写的顺序从上往下执行
预解析
分为变量预解析(变量提升)和函数预解析(函数提升)
- 变量预解析:就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作
- 函数预解析:就是把所有的函数声明提升到当前作用域的最前面,不调用函数