JS函数

89 阅读2分钟

函数

函数的定义

//函数的定义     创建一个盒子
    //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的阶乘