预解析阶段,变量与函数声明提升与覆盖的本质是什么?

预解析阶段,变量与函数声明提升与覆盖的本质是什么?

    console.log(a);


    var a = 1;

    console.log(a);


    function a() {

      console.log(2);

    }

    console.log(a);


    function a() {

      console.log(3);

    }

    console.log(a);


    a = 4;

    console.log(a);

解析阶段,变量与函数声明提升,本质顺序是否是这样的:

    1. 变量按顺序声明提升

    2. 函数按顺序声明提升

    3. 同名声明提升,后执行代码会覆盖先执行的

大致等同于:

    // 变量声明,在函数声明提升之前

    var a = undefined;

    // 函数声明后覆盖变量

    function a() {

      console.log(2);

    }

    // 同名函数再次声明后覆盖前面的变量

    function a() {

      console.log(3);

    }

    // 等价代码

    console.log(a);

    // 对变量 a 赋值

    a = 1;

    console.log(a);


    // 此位置代码被提升

    // function a() {

    //   console.log(2);

    // }

    // console.log(a);

    // function a() {

    //   console.log(3);

    // }

    // console.log(a);


    // 对变量 a 赋值

    a = 4;

    console.log(a);


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,整体理解是对的,不过第三点“同名声明提升,后执行代码会覆盖先执行的”这句理解,老师要再补充一个注意的点,如下:

同名的变量或函数声明提升,后面书写的代码会覆盖前面的。但是对于变量和函数同名时,函数声明提升会覆盖变量声明提升,与代码书写的位置无关,示例:

https://img1.sycdn.imooc.com//climg/61cbc8dc09bc3e8d05760640.jpg

函数与变量同名了,即使声明变量的代码书写在后面,但是函数声明提升会覆盖变量声明提升,所以最终输出结果为函数a。

祝学习愉快~

  • 苍天的庭师之珏 提问者 #1


    我的意思是,所有变量进行声明提升后的的声明位置,都要早于函数升明提升后的声明位置,因此函数声明总会在变量声明之后,所以函数声明会覆盖变量声明

    2021-12-29 11:56:41
  • 理解是对的,祝学习愉快~

    2021-12-29 13:10:18
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师