今天们来探讨js中的函数相关问题
首先函数分为两个阶段
定义阶段 调用阶段
创建一个函数
声明式函数创建
function fn(){
console.log('我执行了')
}
fn()
赋值式函数创建
var fn = function () {
console.log('我是函数fn')
}
fn()
fn()为函数调用,只有函数调用才能执行函数体的代码
浏览器做变量提升
浏览器做变量提升是指,浏览器会把声明式函数提升到script的最顶部位置,所以声明式函数可以在函数定义前调用函数,而赋值式函数则不可以会报错打印fn is not a function,原因在于在经过变量提升,值为undefiend
fn()
var fn = function () {
console.log('我是函数fn')
}
fn()
function fn(){
console.log('我执行了')
}
函数的参数
函数的参数分为两个 形参(写在函数定义时的那个小括号内) 实参 (写在函数调用时的那个小括号内)
function fn(a,b){
console.log('a,b')
}
fn(100,200)
此时打印出a的值为100 b的值为200
当函数的形参多于实参那么多余的形参的值为undefiend
当函数形参少于实参的时候那么多余的实参将无法通过形参来获取
注意两者是一一对应的关系
函数的返回值
案例 计算 a + b 的值
function fn(a,b){
return a + b
}
var res = fn(100,200)
函数返回值的关键字 return
注意,return 有中断函数执IM行的效果,一定要放到代码最后
一定要定义一个变量来接收函数返回值,具体原因,稍后会讲
作用域
作用域有两个 全局作用域 私有(局部)作用域
全局作用域是script标签内的
私有作用域是写在函数里面的
域解析
console.log(num)//undefiend
var num = 100;
console.log(num)//100
域解析是将var关键字和function关键字的变量进行提升(注意提升的是变量不是变量的值) 函数提升的时候会将函数体进行提升,在函数没有调用之前以字符串的形式存储 如果函数体内也有普var function关键字会在函数调用的时候进行域解析
function fn(a,b){
console.log(a,b)
}
fn(100,200)
页面一加载,首先会被提升到页面最上面,浏览器在真正就会执行代码就会执行之前就知道fn()是一个函数,fn()函数就会执行
var fn = function () {
console.log('我是函数fn')
}
fn()
而赋值式变量就会把赋值号左边的变量进行提升,在进行与解析的时候就会将fn变量提升到浏览器最前面,此时的fn是变量,代码从上而下执行,fn是一个变量,不是函数,所以会报错 fn is not a function 域解析案例
var num = 20
function fn(){
var a = 30
console.log(a)//30
function fnn (){
var n = 50
console.log(n)//50
}
fnn()
}
fn( )
第一次执行var num进行与解析赋值为20,然后是函数fn,直到遇到fn()函数调用的时候执行函数体里面的代码 第二次执行var a进行与解析赋值为30,然后是函数fn,console.log(a)输出30 第三次执行函数fnn进行域解析知道遇到fnn()执行函数体内的代码 var n 进行域解析,将变量n赋值为50 console.log(n)打印50 所以输出的值为 a = 30 b = 50
递归函数 通俗点说就是函数内部调用函数,也即是函数自己调用自己 函数内一定要有结束条件否则就是死递归 案例求1到5的和
function fn(n) {
if (n === 1) {
return 1
} else {
return n + fn(n - 1)
}
}
var res = fn(5)
console.log(res)
分析 结果为 5+4+3+2+1 也就是说 5+fn(4) 4+fn(3) 3+fn(2) 2+fn(1) fn(1) === 1 第一次执行,n = 5 不满足条件n === 1 return 5 + fn(4) 第二次执行,n = 4 不满足条件n === 1 return 4 + fn(3) 第三次执行,n = 3 不满足条件n === 1 return 3 + fn(2) 第四次执行,n = 2 不满足条件n === 1 return 2 + fn(1) 由于fn(1) = 1 fn(2) = 3 fn(3) = 6 fn(4) = 10 fn(5) = 15 所以结果为15