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