代码改变世界

JS的块级作用域

2017-04-16 12:08  心猿意‘码’  阅读(2235)  评论(0编辑  收藏  举报

今天带来的是 “对《你不知道的js》中块级作用域的总结” 分享:

1)用with从对象中创建出来的作用域只在with声明中而非外部作用域有效,同时可以访问已有对象的属性并将其添加到已有对象上

代码demo:

         var obj = {
             a:1,
             b:2,
             c:3
         };
         with(obj){
             a=3;
             b=4;
             c=5;
d=6; } console.log(obj);
//3,4,5

2)try/catch 的catch分句会创建一个块级作用域,其中声明的变量仅在catch内部有效

代码demo:

        try{
            undefined();//执行一个非法操作来强制制造一个异常
        }
        catch(err){
            console.log(err);//能够正常执行
        }
        console.log(err);//ReferenceError:err is not defined

3)let用法:可以将变量绑定到所在的任意作用域中(通常是{...}内部)

代码demo:

         for(i = 1; i < 5; i++){
             console.log(i);//1 2 3 4
         }
         console.log(i);//5

         for(let j = 1; j < 5; j++){
             console.log(j);//1 2 3 4
         }
         console.log(j);//ReferenceError: j is not defined

由于let创建的是块级作用域,所以外部无法访问到let声明的变量

4)const:可以用来创建块作用域变量; 其值是固定的(常量),之后任何试图修改值的操作都会引起错误

代码demo:

        var foo = true;
        if(foo){
            var a = 2;
            const b = 3;//包含在if中的块作用域常量
            a = 3;//正常
            //b = 4;//错误
            //console.log(b);//TypeError: invalid assignment to const `b'(这里说明其值为常量,之后不能更改其值)
        }
        console.log(a);//3
console.log(b);//ReferenceError!(这个异常可以证明const创建的块作用域)