Skip to content

语句块

所有的语句的{}部分,都是语句块

js
if () {语句块}
for () {语句块}
switch () {语句块}

语句块结合let声明的表现分析

  • ES5中,语句块不会形成作用域
js
        if (true) {
            var a = 1;
        }
        console.log(a);
  • 在let声明中,语句块内部会在收集变量的时候,会触发引擎在语句块中创建一个独立作用域(块级作用域)
  • 在所有语句块中let声明的变量,被收集的时机都是在代码解释执行的阶段。
js
        debugger
        if (true) {
            debugger
            let a = 1;
            debugger
        }
        console.log(a);

块级作用域

系统或手动的创建的非全局,非脚本,非函数作用域的其他作用域

js
        // global {
        //     a: undefined
        // }
        {
            // block: {
            //     b: ?
            // }
            var a = 1;
            let b = 2;
        }

        // var a 会被收集在global作用域中,外部能够访问。
        // let b 收集变量,创建block作用域(块级作用域),外部不能访问。
        console.log(a);
        console.log(b);
js
        switch (true) {
            case true:
                let a = 1;
                break;
        }

        // 外界无法访问块级作用域中的变量
        console.log(a);
js
        switch (true) {
            // Block scope
            case true:
                let a = 1;
            case true:
                console.log(a);
        }

在第二个case中,我们能访问到变量a ,则说明块级作用域是在switch (true) {} 内部