• JS 预解释相关理解


    1、JS中的内存空间分为两种:栈内存、堆内存
    栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存
    堆内存:存储引用数据类型的值(对象是把属性名和属性值存储进去,函数是把函数体中的代码当做字符串存储进去)

    2、当浏览器加载我们HTML页面的时候,首先会提供一个供JS代码执行的环境->全局作用域(global->window)

    3、在JS代码执行之前,浏览器还需要自己做一些事情:把所有带var/function关键字的进行提前的声明或者定义 ->"预解释"(变量提声)
    声明(declare) -> 告诉浏览器我有这样一个东西啦,例如 var num1; function fn;
    定义(defined) -> 给我们声明的变量或者函数赋值,例如 num1=12; fn=function(){}
    [重要]变量只声明没有定义,默认的值是undefined(未定义)

    4、var和function在预解释阶段处理是不一样的
    var -> 在预解释的时候只是提前的声明了这个变量,只有当代码执行的时候才会完成赋值操作
    function -> 在预解释的时候会提前的把声明加定义都完成了(在代码执行的时候遇到定义的代码直接的跳过)
    [重要]刚开始只对window下的进行预解释,fn函数中目前存储的都是字符串,所以var total没啥实际的意义,所以不进行预解释 -> "预解释是发生在当前作用域下的"

    console.log(obj);//->undefined
    var obj = {name: "张珊珊", age: 10};
    function fn(num1, num2) {//代码执行到这一行的时候直接的跳过,因为在预解释的时候我们已经完成了声明加定义
    var total = num1 + num2;
    console.log(total);
    }
    var num1 = 12;

    fn(num1, 100);//执行fn,把全局变量num1的值赋值给形参num1,把100赋值给形参num2

    5、在全局作用域下声明的变量是全局变量
    在私有作用域中声明的变量是私有变量;函数的形参也是私有的变量;

    如何分辨函数中出现的变量是私有的还是全局的?
    首先看是否为形参,然后看是否在私有作用域中声明过(有没有var过),两者有其一就是私有的变量,那么在当前函数中不管什么位置出现都是私有的,和全局的没有半毛钱的关系;如果两者都没有,说明不是私有的,则往其上一级作用域进行查找...


    6、函数执行的时候会形成一个新的私有的作用域(栈内存),供函数体中的代码执行;
    1)给形参赋值
    2)私有作用域下的预解释
    3)私有作用域下的代码执行
    形成的新的私有的作用域还保护了里面的私有变量不受外界的影响,我们把函数的这种保护机制->"闭包

    区别:带var的可以在代码执行前进行声明,而不带var的不能提前的声明

     

    1、不管条件是否成立都要进行预解释
    window预解释:var a; -> window.a;
    if (!("a" in window)) {//"a" in window -> true
    var a = "我们";
    }
    console.log(a);//->undefined

    2、预解释只发生在"="的左边,只把左边的进行预解释,右边的是值是不进行预解释的

    匿名函数之函数表达式:把函数定义的部分当做值赋值给一个变量或者元素的事件
    预解释的时候:var fn; ->fn的默认值是undefined
    fn();//->undefined() Uncaught TypeError: fn is not a function JS中只有函数可以执行 && JS上面的代码如果报错了,在不进行任何的特殊处理情况下我们下面的代码都不在执行了
    var fn = function () {
    console.log("ok");
    };
    fn();

    预解释的时候:fn=xxxfff000
    fn();//->"ok"
    function fn() {
    console.log("ok");
    }
    fn();//->"ok"


    3、函数体中return下面的代码都不在执行了,但是下面的代码需要参加预解释;而return后面的东西是需要处理的,但是由于它是当做一个值返回的,所以不进行预解释;
    var total = 300;
    function fn() {
    console.log(total);
    return function sum() {};//return是把函数中的值返回到函数的外面,这里是把function对应的内存地址返回的到函数的外面,例如:return xxxfff111;函数体中return下面的代码都不在执行了
    var total = 10;
    }
    fn();

    4、匿名函数的function在全局作用域下是不进行预解释的
    匿名函数之自执行函数:定义和执行一起完成了
    (function(num){})(100);
    5、在预解释的时候,如果遇到名字重复了,只声明一次,不重复的声明,但是赋值还是要重复的进行的
    在JS中变量的名字和函数的名字如果一样是算作重复的
    预解释:
    var fn; 声明
    fn = xxxfff000; [声明]不要了+定义
    fn = xxxfff111; [声明]不要了+定义
    ->fn=xxxfff111
    var fn = 12;//window.fn=12
    function fn() {//window.fn=function(){}
    }
    function fn() {
    }

  • 相关阅读:
    vue过滤器
    laravel service provider(服务提供器)使用场景
    laravel下视图间共享数据的两种方法
    【实例】laravel给所有视图共享数据
    Java并发(八)计算线程池最佳线程数
    mybatis-plus多表联合分页查询
    MybatisPlusException: can not find lambda cache for this entity[]异常解决
    Swagger2学习——@ApiImplicitParams注解
    Spring Validation 校验
    SpringBoot:通过多个Context限制Bean的活动范围
  • 原文地址:https://www.cnblogs.com/supershare/p/5620942.html
Copyright © 2020-2023  润新知