JS 关于链式 bind 的操作

Posted by Yun on Fri, May 5, 2023

在 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.