Page 166 - Node.js开发指南
P. 166
附录 A JavaScript 的高级特性 159
} 1
};
var foo = {
name: 'foobar'
};
2
foo.func = someuser.func;
foo.func(); // 输出 foobar
foo.func1 = someuser.func.bind(someuser);
3
foo.func1(); // 输出 byvoid
func = someuser.func.bind(foo);
func(); // 输出 foobar
4
func2 = func;
func2(); // 输出 foobar
上面代码直接将 foo.func 赋值为 someuser.func,调用 foo.func() 时,this指
针为 foo,所以输出结果是 foobar。foo.func1 使用了 bind 方法,将 someuser 作
为this指针绑定到 someuser.func,调用 foo.func1() 时,this指针为 someuser, 5
所以输出结果是 byvoid。全局函数 func 同样使用了 bind 方法,将 foo 作为 this 指
针绑定到 someuser.func,调用 func() 时,this 指针为 foo,所以输出结果是 foobar。
而 func2 直接将绑定过的 func 赋值过来,与 func 行为完全相同。
6
3. 使用 bind 绑定参数表
bind 方法还有一个重要的功能:绑定参数表,如下例所示。
var person = {
name: 'byvoid', 7
says: function(act, obj) {
console.log(this.name + ' ' + act + ' ' + obj);
}
};
8
person.says('loves', 'diovyb'); // 输出 byvoid loves diovyb
byvoidLoves = person.says.bind(person, 'loves');
byvoidLoves('you'); // 输出 byvoid loves you
9
可以看到,byvoidLoves 将 this 指针绑定到了 person,并将第一个参数绑定到
loves,之后在调用 byvoidLoves 的时候,只需传入第三个参数。这个特性可以用于创建
一个函数的“捷径”,之后我们可以通过这个“捷径”调用,以便在代码多处调用时省略重
复输入相同的参数。 10