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

附录 A  JavaScript 的高级特性    157


                     bar: someuser.display,                                                           1
                     name: 'foobar'
                   };

                   foo.bar(); // 输出 foobar
                   JavaScript  的函数式编程特性使得函数可以像一般的变量一样赋值、传递和计算,我们                                      2
               看到在上面代码中,foo 对象的 bar 属性是 someuser.display 函数,使用 foo.bar()
               调用时,bar 和 foo 对象的函数看起来没有区别,其中的 this 指针不属于某个函数,而
               是函数调用时所属的对象。
                   在 JavaScript 中,本质上,函数类型的变量是指向这个函数实体的一个引用,在引用之                                      3
               间赋值不会对对象产生复制行为。我们可以通过函数的任何一个引用调用这个函数,不同之
               处仅仅在于上下文。下面例子可以帮助我们理解:
                                                                                                      4
                   var someuser = {
                     name: 'byvoid',
                     func: function() {
                       console.log(this.name);
                     }
                   };                                                                                 5

                   var foo = {
                     name: 'foobar'
                   };
                                                                                                      6
                   someuser.func(); // 输出 byvoid

                   foo.func = someuser.func;
                   foo.func(); // 输出 foobar
                                                                                                      7
                   name = 'global';
                   func = someuser.func;
                   func(); // 输出 global
                   仔细观察上面的例子,使用不同的引用来调用同一个函数时,this 指针永远是这个引
                                                                                                      8
               用所属的对象。在前面的章节中我们提到了 JavaScript 的函数作用域是静态的,也就是说一
               个函数的可见范围是在预编译的语法分析中就可以确定的,而上下文对象则可以看作是静态
               作用域的补充。
                   1. call 和 apply                                                                    9
                   在 JavaScript 中,call 和 apply 是两个神奇的方法,但同时也是容易令人迷惑的两个
               方法,乃至许多对 JavaScript 有经验的人也不太清楚它们的用法。call 和 apply 的功能是
               以不同的对象作为上下文来调用某个函数。简而言之,就是允许一个对象去调用另一个对象
               的成员函数。乍一看似乎很不可思议,而且容易引起混乱,但其实 JavaScript 并没有严格的                                        10
   159   160   161   162   163   164   165   166   167   168   169