JS 函数

80 阅读2分钟

函数

函数 定义 和 调用

js
    函数定义的时候
        1.在栈内存中开启一个空间
        2.将函数内部的代码  复制到 这个空间中
        3.将这个空间的地址,赋值给函数名
    函数调用的时候
        1.按照函数名内部的地址,去堆内存中寻找对应的代码  (我们默认寻找到函数了)
        2.在调用栈中开启一个空间(我们叫做执行空间)
        3.在执行空间进行形参赋值
        4.在执行空间进行预解析
        5.在执行空间内执行函数内部的完整代码
        6.当函数执行完毕后,关闭/销毁  执行空间
        
    // 定义
    function fn() {
        
    }
    // 调用
    fn()

如何创建一个 不会销毁的执行空间

js
    在JS 中 如果想要拥有一个永远不会销毁的执行空间
    那么 只需要 在函数内部返回一个引用数据类型,并且 在函数外部要有变量保存这个函数内部的
    一个返回出来的引用数据
    如果你以后不需要这个执行空间了,那么只需要 将外部 的 变量更改一个引用地址就行
js
    <script>
        function fn() {
            const obj = {
                name: '张三',
                age: 18
            }
            return obj
        }

        let res = fn()
        console.log(res)  // {name: '张三', age: 18}

        res = null // 当代码 运行完毕后,切断了与fn 函数内部返回的引用数据之间的关联
                   // 那么 res 的 值就变了,并且 fn 函数遗留的一个执行空间也就被完全销毁
        console.log(res)
    </script>

闭包

js
    书写闭包,需要创建一个不会撤销的内存空间
    需要 直接/间接 返回一个函数
    内部函数,需要访问外部函数内创建的局部变量
    
    
    优点: 延长了变量的使用时间
    
    缺点:每一个闭包都会创建一个不会撤销的内存空间
            如果闭包书写太多,那么这个被撤销的空间就越来越多
            就会造成页面/程序的卡顿
js
    <script>
        function outter() {
            const str = '我是 outter 函数内部创建的变量'

            function inner() {
                console.log(str)
            }

            return inner
        }

        const res = outter()

        res()  // 我是 outter 函数内部创建的变量
    </script>