关于JS声明提升

声明提升简述

    声名提升是JS引擎对js代码预处理时做的工作,可以理解为把函数和变量的声明给提到靠前的位置。
其中值得注意的是只是提升了声明,而赋值并没有跟着提升。

    <script type="text/javascript">
        console.log(a);
        var a=10;//undefined
    </script>

在预处理后,就变成了

    <script type="text/javascript">
        var a
        console.log(a);
        a=10;//undefined
    </script>

这也就是为何输出undefined而不是报错的愿意因了

函数声明提升

首先探讨它的优先级:
如下代码:

    <script type="text/javascript">
        function fn() {
            console.log(1);
        }
        function fn() {
            console.log(2);//2
        }
        fn();
        /*
        function fn() {
            console.log(3);
        }
        function fn() {
            console.log(4);
        }
        fn();
        */
    </script>
    <script type="text/javascript">
        function fn() {
            console.log(1);
        }
        function fn() {
            console.log(2);
        }
        fn();
        function fn() {
            console.log(3);//3
        }
        /*
        function fn() {
            console.log(4);
        }
        fn();
        */
    </script>
    <script type="text/javascript">
        function fn() {
            console.log(1);
        }
        function fn() {
            console.log(2);
        }
        fn();
        function fn() {
            console.log(3);
        }
        function fn() {
            console.log(4);//4
        }
        fn();
    </script>

根据这几个例子,可以结论:函数声明时存在声明提升,而且是后者覆盖前者。函数的声明直接提升到作用域的最顶部。
而对于函数表达式,则不存在函数提升的情况。

    <script type="text/javascript">
        x();//error
        var x=function () {
            console.log(1);
        }
    </script>

变量声明提升

变量声明提升与函数声明提升类似,但要注意只是提升了声明,而赋值还是在原地,覆盖情况与函数声明一致。

<script type="text/javascript">
    console.log(num);//undefined
    var num=1;
    console.log(str);//1
    var num;
    console.log(num);//1
    var num=2
    console.log(num)//2
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值