函数
函数的定义
//函数的定义 创建一个盒子
//1声明式定义
//语法:
function fn(){}
//function :关键字 表明后续的是一段函数
//fn: 函数的名字 将来函数调用时需要用到,函数名自定义
//(): 内部填写参数
//{}: 内部填写函数调用时要执行的代码
//2赋值式定义
//语法:
var fn = function (){}
//function :关键字 表明后续的是一段函数
//fn: 函数的名字 将来函数调用时需要用到,函数名自定义
//(): 内部填写参数
//{}: 内部填写函数调用时要执行的代码
函数的调用
//函数的调用 使用盒子内的代码
//语法:
函数名() / 变量名()
函数的预解析
//执行顺序
//预解析的一个表现就是 生命式函数在定义前可以被调用
//正常书写的代码:
fn()
function(){
console.log('我是fn函数,我被调用了')
}
//预解析后的代码:
function fn(){
console.log('我是fn函数,我被调用了')
}
函数的作用域
//变量可以起作用的范围
//作用域分为两个
//1.全局作用域(直接在script内书写的代码)
//在此作用域创建的变量,在当前script标签内哪里都可以使用
//2.局部作用域(在JS中,只有函数能够创建局部作用域
//在此作用域创建的变量,只能在当前作用域中使用(也就是在函数外边无法使用)
//作用域链
//作用域链就是在访问一个变量时,如果当前作用域内没有,回去自己的父级作用域内查找,如果找到就直接使用,如果没有找到就会继续向上层查找,直到查找到最顶层的全局作用域,还没有找到的话就会显示变量未定义
//赋值规则
//1.先在自己作用域内部查找,有就直接赋值
//2.没有就去上一级作用域内部查找,有就直接赋值
//3.还没有再去上一级作用域查找,有就直接赋值
//4.如果全局作用域都没有,那么这个变量,为未定义
递归函数
//本质上还是一个函数
//当一个函数在函数的内部,调用了自身,那么就算是一个递归函数
//100!
function fn(n){
if(n === 1){
return 1
}
else{
return n * fn(n-1)
}
}
var sum = fn(100) //sum的值为 100的阶乘