函数的存储 堆和栈

   var int1 = 100;
        var int2 = 100;

        console.log( int1 == int2 );

        function fun1(){
            return 100;
        }

        function fun2(){
            return 100;
        }

        // 当前 比较的是 函数名称 fun1 中存储的内容 和 函数名称 fun2中存储的内容
        // 不是 比较 fun1 和 fun2 函数的执行结果
        console.log( fun1 == fun2 );//false

        // 如果输出查看函数名称
        // 虽然不能看到内存地址,但是我们可以看到,内存地址中,存储的字符串形式的函数程序
        // 看不到内存地址的原因是,浏览器会自动根据内存地址,找到对应的存储空间,显示其中存储的内容
        console.log( fun1 );

        // 有()是在调用函数,没有()是函数的名称
        // 这里是比较两个函数的返回值 
        console.log( fun1() == fun2() );//true

        // 函数的定义和函数的存储

        // 函数的定义封装阶段,程序的执行过程
        // 1,不管函数还是变量,都是存储在内存之中的
        //   会先在内存中,开辟一个存储空间,来准备存储函数
        //   并且 操作系统 会给 这个存储空间 定义一个 内存地址 
        // 2,将函数定好的内容,存储在这个内存空间中
        //   此时 函数的程序 内容 是以 类似于 字符串的形式来存储
        //   此时 并没有执行 函数的程序 , 只是以字符串的形式存储在内存空间中
        // 3,将 内存空间的 内存地址 赋值给 函数名称(声明式) / 变量(匿名函数/赋值式) 进行存储
        //   实际上 函数名称 / 变量  中  实际存储的是 内存地址

        // 函数的调用和执行
        // 1,读取 函数名称 / 变量 中 存储的内存地址
        // 2,通过 内存地址,找到存储变量的内存空间,获取对应的函数程序
        // 3,给函数中的参数,进行赋值
        // 4,执行函数 的 预解析 / 预解释 
        // 5,执行函数中存储的代码程序
 
    在 内存 中 操作系统将内存分成了两个部分, 堆 和 栈 

        堆和栈的作用不同,存储不同的数据类型

        栈 存储基本数据类型 布尔类型 数值类型 字符串类型 undefined null 
        堆 存储引用数据类型 函数 数组 对象 

        栈 是 以 有序的方式 存储数据 
           先定义变量,会存储在栈的最下方
           存储 基本数据类型 变量中 存储的就是 数据数值

        堆 是 以 无序的方式 存储数据
           函数等,数值数值 存储在 堆 中 
           变量名称 / 函数名称 存储在 栈 中 
           变量名称 / 函数名称 中存储的是 堆 行中 内存空间的内存地址

        
        总结:
            基本数据类型比较,比较的是 存储的数值数据
            引用数据类型比较,比较的是 存储的内地地址

            基本数据类型,赋值,赋值的是 存储的数据数值
            引用数据类型,赋值,赋值的是 存储的内存地址


            即时两个应用数据类型,数据内容都完全一致
            因为存储的内存空间不同,变量名称/函数名称 中存储的内存地址也不同

            两个引用数据类型,比较判断,一定是 不等 的
右侧打赏一下 代码改变世界一块二块也是爱
原文地址:https://www.cnblogs.com/ht955/p/14021895.html