在 JS 中可以利用 .bind
的方式重新指定 this
的指向,而级联(链式)的 .bind
并不会奏效,只会绑定第一个 bind 的 this
。以下是一种 .bind
的实现:
1if (!Function.prototype.bind) {
2 Function.prototype.bind = function(oThis) {
3 if (typeof this !== 'function') {
4 throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable')
5 }
6 var aArgs = Array.prototype.slice.call(arguments, 1),
7 fToBind = this,
8 fNOP = function() {},
9 fBound = function() {
10 return fToBind.apply(
11 this instanceof fNOP ? this : oThis,
12 aArgs.concat(Array.prototype.slice.call(arguments))
13 )
14 }
15 if (this.prototype) {
16 fNOP.prototype = this.prototype;
17 }
18 fBound.prototype = new fNOP()
19 return fBound
20 }
21}
可以看到,若链式进行 .bind
操作,实际的代码会变为一层一层的 apply 嵌套,在此情况下,只有最内层的 apply this 会对原始函数奏效。
版权声明:本文遵循 CC BY-SA 4.0 版权协议,转载请附上原文出处链接和本声明。
Copyright statement: This article follows the CC BY-SA 4.0 copyright agreement. For reprinting, please attach the original source link and this statement.