【问题标题】:What does "a.call.apply(a.bind, arguments)" mean?“a.call.apply(a.bind, arguments)”是什么意思?
【发布时间】:2022-01-05 15:37:46
【问题描述】:

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

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) 究竟做了什么?

【问题讨论】:

  • 这段代码是你写的还是你找到的?无论哪种方式都有缺陷 - fn 返回一个函数,但 boundFn 没有对它的返回值做任何事情。因此,代码是浪费 CPU 周期的一种非常过分的方式。
  • 这是我想要理解的真实代码: kaa = function(a, b, c) { return a.call.apply(a.bind, arguments) } laa = function(a , b, c) { // } D = function(a, b, c) { Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? D = kaa : D = laa;返回 D.apply(null, arguments) };我从 youtube js 代码中得到它
  • a.call.apply(a.bind, arguments) 是写a.bind(b, c)a.bind(Array.from(arguments).slice(1)) 的繁琐方式(bc 从未使用过,因此请从参数列表中删除它们)。
  • @SebastianSimon 这很麻烦,但它是使用 ES5 进行可变参数调用的唯一方法。其余代码也遵循此规范。

标签: javascript apply call bind


【解决方案1】:

如果你有这样的功能:

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

您可以使用unboundedFn.call(thisObj, arg1, arg2)unboundedFn.apply(thisObj, [arg1, arg2]) 来运行它,但要更改this 内部的含义。 callapply 都做同样的事情,唯一的区别是传递参数的方式。

因为callapplybind 都是方法,你可以运行例如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);
}

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    相关资源
    最近更新 更多