ES6作用域的一个问题

函数的形参初始化的一个问题

在这里插入图片描述

for循环监听的一个问题

在这里插入图片描述

ES6中如何区分函数作用域和块作用域

在这里插入图片描述

调试每一步如下所示:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

紧挨着的上面的那个图里面,1处表示,块级作用域结束,但是,函数作用域还在

在这里插入图片描述

上面表示函数作用域也结束了

但是,在函数作用域中继续用let定义age时,会报错,根据ES6语法,用let定义的变量不能在同一作用域内被重复定义(声明),这个从侧面,证明了,此时函数作用域包括function()中的括号和该funciton(){}对应的中括号的内容,还有一点值得注意的是,此时函数作用域中的function()里面的{}中的内容,同时是一个块级作用域

在这里插入图片描述

看看以下作用域的问题

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>letandconstant</title>
    <script>
        window.onload = function () {
            function add(...values) {
                let sum = 0;
                let val = 1
                for (let val of values) {
                    let val
                    console.log(val) //undefinded
                    sum += val;
                }

                return sum;
            }

            console.log(add(2, 5, 3)) // 1
        }
        // console.log(val)

    </script>
</head>

<body>
    <ul id="list">
        <!-- <li><a href="javascript:;">1</a></li>
        <li><a href="javascript:;">2</a></li> -->
    </ul>
    <br>
    <br>
    <button id="btn01">点击我增加一个a</button>
</body>

</html>

在这里插入图片描述

上面的那个for循环这个()里面是一个单独的块作用域,不是和for(){}的这个花括号里面的作用域完全没有关系,但是,可以说是父子作用域的关系,但是,这个不同于function()中的这个小括号,和function(){}中的花括号的作用 域的问题

下面这个例子,体会下

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>letandconstant</title>
    <script>
        window.onload = function () {
            function add(...values) {
                let sum = 0;
                let val = 1
                for (let val of values) {
                    sum += val;
                    console.log(sum)//这个块级作用域里面没有sum,就会往上一层去找,这里实际上是修改的let sum = 0,这个地方的sum的值
                }

                return sum;
            }

            console.log(add(2, 5, 3)) // 1
        }
        // console.log(val)

    </script>
</head>

<body>
    <ul id="list">
        <!-- <li><a href="javascript:;">1</a></li>
        <li><a href="javascript:;">2</a></li> -->
    </ul>
    <br>
    <br>
    <button id="btn01">点击我增加一个a</button>
</body>

</html>

在这里插入图片描述

重新思考函数提升的一个问题:

在Es5里面,函数能够提升成功,还有一个关键时,该函数名被调用了,否则,只是执行了函数定义,并没有执行函数的话,这个地方是不会有显示的

在这里插入图片描述

在这里插入图片描述

这个里面是查不到fun2的,因为,没有写fun2调用,也就是fun2()

注意在ES5中,函数名会提到当前作用域的顶端,注意这里的顶端不要理解错,假如,这里有两3个函数的嵌套,那么fun3在提升时,提升到fu2函数里面的顶端,而不是fun1函数里面的顶端

在Es6里面多了一个块级作用域

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值