闭包和变量提升和异步同步相关 错题集

本文探讨了JavaScript中的闭包概念,变量提升的机制,以及异步执行的顺序,包括同步到异步(微任务和宏任务)的流程。同时,提到了变量回收机制对代码执行的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置知识点:

  • 在es5中只有全局作用域和函数作用域,而es6中新增了一个块级作用域,就是可以在js文件里任意出使用{ }形成相对独立的作用域(一般用于if和for内部)。

  • 变量提升:先解析代码,获取所有声明的变量,然后代码自上而下依次运行将变量提升到自身所在作用域的头部,这将导致脚本还未执行,而变量却存在,只不过变量的值为undefined。因此注意:变量声明可以提升 但是赋值初始化不提升

  • 计算机语言从右往左的解读模式让var a = b = 1; b 为未被定义,直接被认为是全局变量,而var a被定义在当前作用域下,严格模式下这个b会undefined。

    //经典代码题
    console.log(v1);
    var v1 = 100;
    function foo() {
        console.log(v1);
        var v1 = 200;
        console.log(v1);
    }
    foo();
    
    console.log(v1);
    

    结果是:在这里插入图片描述

  1. 题目一

    var a,b;
    (function(){
        alert(a);
        alert(b);
        var a=b=3;
        alert(a);
        alert(b);
    })();
    alert(a);
    alert(b);
    

    这里的问题是var a=b=3,从右向左解读被看成b=3和var a = b,a是当前函数作用域内的变量,b是全局变量,a在执行完赋值语句后,函数内为3,函数外还是undefined,而b这里就是全局变量,执行完成之后都是3。所以答案是:undefined,undefined,3,3,undefined,3

  2. const相关。
    在这里插入图片描述
    第一个会报错TypeError,第二个却会输出3和12。因为const定义的值是无法修改的,如果是基本类型,保存的就是这个值,但是对象保存的是内存的地址,而const的这个定义是作用在对象保存的这个地址上的,只要你不修改引用,那么就不违背const定义,这里只是操作了指向的那个对象而已,因此毫无影响。

  3. 异步同步。执行顺序是同步→异步(微→宏)→回调。promise是微任务。
    在这里插入图片描述

    1. 变量回收机制。
      在这里插入图片描述
      第二行的var无效,i=2的值覆盖第一个。add右边是立即执行函数,如果没有闭包的话i会被回收。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值