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);