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

158  附录 A  JavaScript 的高级特性


             所谓“成员函数”的概念,函数与对象的所属关系在调用时才展现出来。灵活使用 call 和
             apply 可以节省不少时间,在后面我们可以看到,call 可以用于实现对象的继承。
                 call 和 apply 的功能是一致的,两者细微的差别在于 call 以参数表来接受被调用函
             数的参数,而 apply 以数组来接受被调用函数的参数。call 和 apply 的语法分别是:

                 func.call(thisArg[, arg1[, arg2[, ...]]])
                 func.apply(thisArg[, argsArray])

                 其中,func 是函数的引用,thisArg 是 func 被调用时的上下文对象,arg1、arg2 或
             argsArray 是传入 func 的参数。我们以下面一段代码为例介绍 call 的工作机制:

                 var someuser = {
                   name: 'byvoid',
                   display: function(words) {
                     console.log(this.name + ' says ' + words);
                   }
                 };

                 var foo = {
                   name: 'foobar'
                 };

                 someuser.display.call(foo, 'hello'); // 输出 foobar says hello
                 用 Node.js 运行这段代码,我们可以看到控制台输出了 foobar。someuser.display 是
             被调用的函数,它通过 call 将上下文改变为 foo 对象,因此在函数体内访问 this.name
             时,实际上访问的是 foo.name,因而输出了foobar。
                 2. bind
                 如何改变被调用函数的上下文呢?前面说过,可以用 call 或 apply 方法,但如果重复
             使用会不方便,因为每次都要把上下文对象作为参数传递,而且还会使代码变得不直观。针
             对这种情况,我们可以使用 bind 方法来永久地绑定函数的上下文,使其无论被谁调用,上
             下文都是固定的。bind 语法如下:

                 func.bind(thisArg[, arg1[, arg2[, ...]]])
                 其中 func 是待绑定函数,thisArg 是改变的上下文对象,arg1、arg2 是绑定的参

             数表。bind 方法返回值是上下文为 thisArg 的 func。通过下面例子可以帮你理解 bind
             的使用方法:

                 var someuser = {
                   name: 'byvoid',
                   func: function() {
                     console.log(this.name);
   160   161   162   163   164   165   166   167   168   169   170