"a.call.apply(a.bind, arguments)" 是什么意思?

What does "a.call.apply(a.bind, arguments)" mean?

出于好奇,我想用这种特殊方法制作一个有界函数:

var fn = function(a, b, c) {
    return a.call.apply(a.bind, arguments)
}

var boundFn = function(a, b, c) {
    fn.apply(null, arguments)
}

function unboundedFn() {
    console.log(this, arguments)
}

var boundedFn = boundFn(unboundedFn, x, y);

所以我想了解 a.call.apply(a.bind, arguments) 到底做了什么?

如果你有这样的功能:

function unboundedFn() {
    console.log(this, arguments)
}

您可以使用 unboundedFn.call(thisObj, arg1, arg2)unboundedFn.apply(thisObj, [arg1, arg2]) 来 运行 它,但要改变 this 里面的意思。 callapply 都是一样的,唯一不同的是传递参数的方式。

因为callapply还有bind都是方法,可以运行比如unboundedFn.call.call.call.call.apply.apply.apply.apply(),但是好像没有很有道理。

在您的示例中 return a.call.apply(a.bind, arguments) 等于 return a.bind.call(...arguments),等于 a.bind(...arguments.slice(1)),因此整个 fn 函数可以简化为:

function fn(a,b,...args){
   return a.bind(b, ...args);
}