已经被 bind 绑定的函数是否可以再次被 bind 绑定

Can a function already bound by bind be bound by bind again

面试官问我这个问题,我不知道怎么回答。 问题与this绑定规则有关吗?

function sayName(){
   console.log(this.name)
}

let a={
   name:'name',
}

let b={
   name:'NAME'
}

console.log(sayName.bind(a)())  // 'name'
console.log(sayName.bind(a).bind(b)())  // 'name'
function sayName() {
  console.log(this.name);
}

let a = {
  name: 'name',
};

let b = {
  name: 'NAME',
};

const bindedSayName = sayName.bind(a);

/*以上:您已经为所有常规函数调用了函数原型上可用的作用域函数, 现在 bindedSayName 不再是对 sayName 的引用,而是它持有一个有界函数以及它们的绑定对象 劫持 sayName 并将绑定值作为参数传递给它。背后是这样的

Function.prototype._bind = function (thisRefObj) {
  const parentFunc = this;

  return function () {
    parentFunc({ ...thisRefObj, author: 'Emmanuel Onah' });
  };
};

*/

  console.log(bindedSayName);

/*上面的控制台 returns 是一个有界函数,而不是你的 sayName。 因此,尝试在此处绑定另一件事不会应用于您的 sayName 函数,因为它就像尝试从绑定函数访问绑定方法 */

console.log(sayName.bind(a)()); // 'name'

console.log(sayName.bind(a).bind(b)()); /* 输出是 'name':注意你在“.bind(a) 上调用 .bind(b),它是 sayName 上的有界函数”。就像做 .then(res=>res).then(res=>res.json()) 一样,每个 .then() 都取决于 prevPromise。所以你的 .bind(b) 没有被应用到 sayName 因为你不再引用 sayName。就从对象字面量的角度来想吧*/

此外,您还可以在另一个绑定上调用 bind,因为绑定是使用常规函数创建的,并且常规函数具有 bind 的原型。所以 bind 调用 bind 因为它是一个常规函数。