Page 157 - Node.js开发指南
P. 157

150  附录 A  JavaScript 的高级特性


                 var f = function() {
                   var scope = 'f0';
                   (function() {
                     var scope = 'f1';
                     (function() {
                       console.log(scope); // 输出 f1
                     })();
                   })();
                 };
                 f();
                 上面是一个函数作用域嵌套的例子,我们在最内层函数引用了  scope 变量,通过作用
             域搜索,找到了其父作用域中定义的 scope 变量。
                 有一点需要注意:函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就
             是说,JavaScript  的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可
             以在语法分析时确定,而不必等到运行时确定。下面的例子说明了这一切:

                 var scope = 'top';

                 var f1 = function() {
                   console.log(scope);
                 };
                 f1(); // 输出 top

                 var f2 = function() {
                   var scope = 'f2';
                   f1();
                 };
                 f2(); // 输出 top
                 这个例子中,通过 f2 调用的 f1 在查找  scope 定义时,找到的是父作用域中定义
             的 scope 变量,而不是 f2 中定义的 scope 变量。这说明了作用域的嵌套关系不是在调用
             时确定的,而是在定义时确定的。

             A.1.2  全局作用域

                 在 JavaScript 中有一种特殊的对象称为 全局对象。这个对象在Node.js 对应的是 global
             对象,在浏览器中对应的是 window 对象。由于全局对象的所有属性在任何地方都是可见的,
             所以这个对象又称为  全局作用域。全局作用域中的变量不论在什么函数中都可以被直接引
             用,而不必通过全局对象。
                 满足以下条件的变量属于全局作用域:
                  在最外层定义的变量;
                  全局对象的属性;
   152   153   154   155   156   157   158   159   160   161   162