初识函数
函数的概念
- 把特定的代码片段抽取出来,成为独立运行的实体
函数的好处
- 可以重复使用
- 提高代码的可读性
- 有利于程序的维护
函数的分类
- 分为系统函数(内置函数)和自定义函数
系统函数
- 官方定义好的函数,可以直接调用
- 如: alert(), isNaN(), console.log() ,document.write(), Boolean(), Math.pow()等
自定义函数
- 是用户自己定义的函数, 用户可以根据实际需求, 对特定的功能使用函数来封装
函数的定义和调用
- 定义函数的关键字是 function
声明式
php
定义语法:
function 函数名(形参1,形参2,形参3,...){
函数体
}
调用:
函数名(实参1,实参2,实参3...)
例:
//计算两数和
function fn(num1,num2){
return num1+num2
}
var res = fn(10,20)
console.log(res)
【注】
声明式定义的函数,可以在定义之前进行调用,因为js会进行预解析
例:
//计算两数和
var res = fn(10,20)
console.log(res)
function fn(num1,num2){
return num1+num2
}
赋值式
php
定义语法:
var 函数名 = function(形参1,形参2,形参3,...){
函数体
}
调用:
函数名(实参1,实参2,..)
例:
//计算两数和
var fn = function(num1,num2){
return num1+num2
}
var res = fn(10,20)
console.log(res)
【注】
只能在函数后面对函数进行调用
构造函数创建函数
-
通过构造函数new Function()
dart语法: var 函数名 = new Function("形参1","形参2",...,"函数体"} 调用: 函数名(实参1,实参2,...) 例: var show = new Function("a","b","c","return a+b+c") console.log(show(10,20,30)) 【注】 1、new Function的最后一个参数,是函数的函数体 2、只能在定义函数之后,调用函数
注意事项
- 定义函数必须使用function关键字
- 函数名的命名规范与变量命名规范一致
- 形参:
- 默认值为undefined
- 是一个局部变量,只能在函数内部使用
- return关键字:
- 返回结果,并终止函数,在函数体中,return后面的代码不会被执行
- 函数体中不一定要有return,没有return就表示没有返回值
- 函数的返回值默认为undefined
- 实参:确定了形参的类型
- 函数只有被调用了才会执行
函数的参数
形参和实参
- 形参:形式参数,声明函数的时候写在小括号里面的参数
- 实参:实际参数,在函数调用的时候需要传递实际有值得参数
- 规则:
- 实参个数 = 形参个数 : 挨个传递
- 实参个数 > 形参个数 : 多于的实参直接丢弃
- 实参个数 < 形参个数 : 多的形参值默认为undefined
arguments 类数组对象
- 是一个伪数组,有下标,不具备数组方法
- 它只能在函数内部出现
- 通过索引(下标)取值
- 取值的范围为0~arguments.length
- 取值方式arguments [ 索引 ( 下标 ) ]
- 作用:可以动态接收实参
作用域和作用域链
变量的作用域
- 作用域:变量作用的范围,可以分为全局变量和局部变量
全局变量
- 在函数外面定义的变量
- 在函数内部不使用var定义的变量
- 作用范围为整个程序的执行范围
局部变量
- 在函数内部通过var关键字定义的变量或者形参
- 作用范围只在某个函数体内部
- 在函数体内部,当局部变量与全局变量重名时,局部变量优先于全局变量
作用域链
- 当函数内部访问某一个变量时候,首先去函数内部查找,如果内部没有,就向外层函数查找,如果外层函数,没有就向(浏览器像window)全局查找,这个"查找的过程"就叫做"作用域链"
- 简单理解:内层环境中不断向外寻找变量和函数的过程
递归
- 概念:程序调用自身的编程技巧称为递归
- 运行的过程中不断的调用自己,本质就是循环
- 注:不能无限制的调用自己,一定要有退出条件,避免死循环
js
例:
function fn(n){
if(n==1){
return 1
}
return n * fn1(n-1)
}
console.log(fn(5))
解析图:
运行与与预解析
- 语法分析:查找基本语法有没有错误
- 预解析:在js代码执行之前进行预解析 将var和function提升到当前作用域的顶部
变量的默认值为undefined,函数默认值为函数体
当函数与变量重名时,保留函数
- 解释执行