Page 59 - 你不知道的JavaScript(下卷)
P. 59

foo();                 // 因为foo()而运行
                                          // 声明是“被提升的”

                   function foo() {
                       a = 3;

                       console.log( a );  // 3

                       var a;             // 声明是“被提升的”
                                          // 到foo()的顶端
                   }

                   console.log( a );      // 2

                          在变量声明出现之前,依靠变量提升在其作用域使用这个变量并不常见,也
                          并不是一个好的想法;这样的代码可能会令人非常迷惑。相比之下,使用提
                          升后的函数声明则要常见得多,就像我们在 foo() 的正式声明出现前就调用
                          了它。


               2. 嵌套作用域
               声明后的变量在这个作用域内是随处可以访问的,包括所有低层 / 内层的作用域。举例
               来说:
                   function foo() {
                       var a = 1;

                       function bar() {
                           var b = 2;

                           function baz() {
                               var c = 3;

                               console.log( a, b, c );  // 1 2 3
                           }

                           baz();
                           console.log( a, b );         // 1 2
                       }

                       bar();
                       console.log( a );                // 1
                   }

                   foo();

               注意,在上述示例中,c 在 bar() 的内部是不可访问的,因为它只声明在内层 baz() 作用
               域,b 在 foo() 中是不可访问的,也是同样的原因。

               如果试图在一个作用域中访问一个不可访问的变量,那么就会抛出 ReferenceError。如果


               36   |   第 2 章
                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   54   55   56   57   58   59   60   61   62   63   64