已经被 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 因为它是一个常规函数。
面试官问我这个问题,我不知道怎么回答。 问题与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 因为它是一个常规函数。